auto plus_1 = phx::bind(&plus,1,arg1);
在这一行之后,plus_1
是一个函数对象,它接受一个int
参数并向其添加一个参数。
phx::lambda[plus_1(arg1)](1);
哎呀。这是行不通的,因为(如上所述)plus_1
是一个函数对象,它接受一个int
参数并向其添加一个参数。在这里,您尝试使用arg1
.
从您的代码中看不出您期望它做什么。你能澄清一下吗?
====编辑====
我看到您已经编辑了问题中的代码。您的代码仍然是错误的,但现在出于不同的原因。这:
phx::val(plus_1)(arg1)
... 用于val
创建一个返回plus_1
一元函数的空函数。然后,您尝试使用 调用 nullary 函数arg1
。繁荣。
这是执行和执行(我相信)您想要的代码:
#include <iostream>
#include <boost/phoenix/phoenix.hpp>
namespace phx = boost::phoenix;
using phx::arg_names::arg1;
int plus(int a,int b)
{
return a+b;
}
int main()
{
auto plus_1 = phx::bind(&plus, 1, arg1);
int value = phx::bind(phx::lambda[plus_1], arg1)(1);
std::cout << value << std::endl;
}
第一个bind
接受二进制plus
并将其转换为一元函数,第一个参数绑定到1
. 第二个创建了一个与第一个等效bind
的新一元函数,但它是通过使用 安全地包装第一个函数来实现的。为什么这是必要的?考虑下面的代码,它是等效的,但没有:lambda
lambda
// Oops, wrong:
int value = phx::bind(phx::bind(&plus, 1, arg1), arg1)(1);
请注意,它arg1
出现了两次。所有表达式都是从内到外进行评估的。首先,我们将内部绑定arg1
到1
,然后评估内部bind
yielding 2
,然后我们尝试绑定并调用它。那是行不通的,因为2
它是不可调用的。
的使用为lambda
内部创建了一个范围,arg1
因此它不会被急切地替换。但是就像我说的那样,使用第二个bind
,它强制需要 for lambda
,产生一个与第一个等效的函数。所以它是不必要的复杂。但也许它可以帮助您了解bind
,lambda
和 Phoenix 范围。