我尝试使用带参数的lambda函数调用boost::phoenix::function
并失败。如果我以这种方式调用它而没有参数:
const auto closure = [](){
cout<< "test" << endl;
};
typedef decltype(closure) ClosureType;
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure));
lazyFunc()();
所有编译都很好。但是当我声明lambda的至少一个参数时:
const auto closure = [](int& param) { cout<<"Test" << param << endl; };
typedef decltype(closure) ClosureType;
const boost::phoenix::function<ClosureType> lazyFunc (std::move(closure));
lazyFunc(arg1)(a);
编译失败,在boost::result_of
内部有大量的堆栈跟踪答案 0 :(得分:2)
假设错误指向Boost.ResultOf内部的某个深处(如this demo所示),那将是因为lambda表达式的闭包类型没有实现ResultOf协议。
一个稍微简单的解决方法是定义BOOST_RESULT_OF_USE_DECLTYPE
,这使得boost::result_of
绕过自己的ResultOf协议,而不是使用decltype
来计算返回类型。默认情况下不会启用此功能,因为没有多少编译器(在Boost 1.51发布时)足以使此功能正常工作;计划为那些可以处理1.52的编译器自动定义这个符号(通过Boost.Config)。
Here演示了如何将Boost.Phoenix与decltype
启用boost::result_of
一起使用。我必须将int&
更改为int const&
,因为i
显然是以const int
转发。这似乎是boost::phoenix::function
的基本限制,使用boost::phoenix::val
没有此问题。