2013-02-25 10 views
6

Boost Lambda/Phoenixは、別のラムダを返すlambdaのようなものをすぐにサポートしていますか?カリー化のいくつかの種類を行うために使用することができます。例えばブーストラムダ/フェニックス - 別のラムダを返すラムダをする方法?

、:(ボーナスとして+ - 私たちは、多型の挙動になるだろう)

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

ブーストラムダ/フェニックスと同様の目的を達成するためにどのように?

+0

私はこれに答えるためにしようとしていた問題は、 'arg1'が最も外側' bind'によって消費されることをです - 内部の 'bind'に' arg1'を渡したいのですが、外側の 'bind'が代わりに' bind'を使います。引数のプレースホルダを "エスケープ"する方法があれば... – Yakk

+0

@ Yakk、boost :: bindを使うことができます - AFAIKはlambda/phoenix bind(http://www.boost.org/doc/)と異なります。 libs/1_53_0/doc/html/lambda/s08.html#idp111396608)。また、回答としてのあなたの試みのポストコード - 賞金は明日終了... – qble

答えて

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

+0

@EvgenyPanasyukには、 '[&]() - > void {fully_bound_expression_that_does_not_run_until_later;}のような遅延評価を生成する簡単な方法があります。 } '? – Yakk

+0

@ Yakk、あなたは何を意味するのでしょうか(詳細はC++ 11ラムダの完全な例を使って)? http://liveworkspace.org/code/30jCv6$0を意味しますか?または、おそらくhttp://liveworkspace.org/code/2Kon3g$0? –