2013-02-25 64 views
6

是否提升Lambda/Phoenix支持出类似lambda的返回另一个lambda?Boost Lambda/Phoenix - 如何做lambda返回另一个lambda?

例如,可以用来做某种哗众取宠的:

std::cout << [](int x){return [=](int y){return x+y;};}(1)(2); 

如何实现与升压LAMBDA /凤凰类似的目的(+作为奖金 - 我们将获得多态行为)?

+0

我在试图回答这是'arg1'得到由最外层的'bind'消耗的问题 - 我想要一个'arg1'我可以传递给内部''bind',但是外部的'bind'会代替它。如果我有办法“逃避”参数占位符... – Yakk 2013-03-04 20:11:43

+0

@Yakk,你可以尝试使用boost :: bind-AFAIK它不同于lambda/phoenix bind(http://www.boost.org/doc/) libs/1_53_0/doc/html/lambda/s08.html#idp111396608)。此外,你的尝试后代码作为答案 - 赏金明天结束... – qble 2013-03-05 11:00:37

回答

5

Boost Phoenix Scope: let/lambda

Live demo:

#include <boost/phoenix.hpp> 
#include <iostream> 
#include <ostream> 

using namespace std; 
using namespace boost; 
using namespace phoenix; 
using namespace arg_names; 
using namespace local_names; 

int main() 
{ 
    // capture by reference: 
    cout << 
     (lambda(_a=_1)[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=_1)[lambda(_a=_1)[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
    // capture by value: 
    cout << 
     (lambda(_a=val(_1))[_1 + _a ])(1)(2) 
    << endl; 
    cout << 
     (lambda(_b=val(_1))[lambda(_a=val(_1))[_1 + _a + _b ]])(1)(2)(3) 
    << endl; 
} 

输出是:

3 
6 
3 
6 
+0

这就是我在找的,谢谢! – qble 2013-03-06 16:26:45

+0

@EvgenyPanasyuk是否有一种简单的方法来生成惰性评估,比如'[&]() - > void {fully_bound_expression_that_does_not_run_until_later; }'? – Yakk 2013-03-09 14:11:07

+0

@Yakk,请您详细描述一下您的意思(可能通过C++ 11 lambda表达式的完整示例)?你的意思是http://liveworkspace.org/code/30jCv6$0?或者也许http://liveworkspace.org/code/2Kon3g$0? – 2013-03-09 16:34:08