无法通过boost :: phoenix :: function调用带参数的惰性lambda函数

时间:2012-10-21 00:59:56

标签: c++ lambda parameter-passing lazy-evaluation boost-spirit

我尝试使用带参数的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

内部有大量的堆栈跟踪

1 个答案:

答案 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没有此问题。