2013-02-25 61 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