2011-01-05 6 views
15

私は、boost :: bindまたはstd :: bindを使ってバインドしたいラムダ関数をいくつか持っています。 (限り、それが動作するようその1、気にしないでください。)残念ながら、両方のそれらの私に異なるコンパイラerrosを与える:lambda関数をboost :: bind/std :: bindでVC++ 2010で使う方法は?

だから、
auto f = [](){ cout<<"f()"<<endl; }; 
auto f2 = [](int x){ cout<<"f2() x="<<x<<endl; }; 

std::bind(f)(); //ok 
std::bind(f2, 13)(); //error C2903: 'result' : symbol is neither a class template nor a function template 

boost::bind(f)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda0>' 
boost::bind(f2, 13)(); //error C2039: 'result_type' : is not a member of '`anonymous-namespace'::<lambda1>' 

、このための最も簡単な回避策は何ですか?

+0

なぜバインドを使用しますか? f()またはf2(1)を呼び出すことはできませんか? – Jagannath

+3

@ジャガナート:これはもちろん単なる例ですが、実際にはバインド結果を関数オブジェクトに格納したいと考えています。 – Timo

+0

なぜあなたはbindを使いたいですか?私はC++ 0xがクロージャを提供したと思いましたか? –

答えて

20

手動で戻り値の型を指定する必要があります。

boost::bind<void>(f)(); 
boost::bind<int>(f2, 13)(); 

あなたドン場合にも、自動的にあなたのラムダのオペレーターを検査するBoost.FunctionTypesを使用して戻り値の型を()推測する自分のテンプレート関数を書くことができますバインドを明示的に伝えたい。

8
std::function<void()> f1 = [](){ std::cout<<"f1()"<<std::endl; }; 
std::function<void (int)> f2 = [](int x){ std::cout<<"f2() x="<<x<<std::endl; }; 
boost::function<void()> f3 = [](){ std::cout<<"f3()"<<std::endl; }; 
boost::function<void (int)> f4 = [](int x){ std::cout<<"f4() x="<<x<<std::endl; }; 

//do you still wanna bind? 
std::bind(f1)(); //ok 
std::bind(f2, 13)(); //ok 
std::bind(f3)(); //ok 
std::bind(f4, 13)(); //ok 

//do you still wanna bind? 
boost::bind(f1)(); //ok 
boost::bind(f2, 13)(); //ok 
boost::bind(f3)(); //ok 
boost::bind(f4, 13)(); //ok 
+0

'function'がランタイムインダイレクションを導入し、' bind'が速い場合のみ...それは? – Dario

+0

私はバインドの結果としてファンクタを呼び出すことは疑いがあります。なぜなら、バインド結果がほとんどの場合にさらに別のレベルの間接参照を追加するためです。いくつかのパラメータをバインドする必要がある状況では、おそらくバインドが必要になります。上記の例では、std :: bind(f2、13)();最初のパラメータを定数値13にバインドします。バインドの結果は、パラメータを取らずにvoidを返す「ファンクタ」です。 – ds27680

+0

'function'のように仮想関数を呼び出すことがないので、' bind'の結果を少し速く呼び出すことができます。 – ltjax

1

あなたはthis MSDN forum postに興味があると思います。 ポスターのような音があなたと同じ問題を抱え、MS Connectでバグを報告しました。

関連する問題