2011-11-11 9 views
14

可能性の重複:
Bind Vs Lambda?std :: bindはlambdaと比べてまだ便利ですか?

std::bindの私の使用は、今ラムダが幅広い支持を得ていることを0まで低下しました。

std::bindはラムダ関数に特有の問題はありますか?

ラムダが追加された時点で、標準でstd::bindを維持する魅力的な理由はありましたか?

+3

引数の型が長い場合、バインドはlambdasよりも__far__である可能性があります。 – ildjarn

+1

http://stackoverflow.com/questions/1930903/bind-vs-lambda/4581747#4581747 –

+1

彼らはまだかなり直交IMOです。 –

答えて

21

あなたが値または参照でキャプチャすることができ、問題が値によってキャプチャが本当による」捕獲を意味していることですコピーする。これは、移動のみのタイプのショーストッパーです。だから、次の操作を実行するためにラムダを使用することはできません。

struct foo { void bar() {} }; 

std::unique_ptr<foo> f { new foo }; 
auto bound = std::bind(&foo::bar, std::move(f)); 
static_assert(std::is_move_constructible<decltype(bound)>::value, ""); 
bound(); 

IIRC標準委員会は簡潔ラムダキャプチャリスト内の任意の式は、([std::move(f)] { return f.bar(); }のように見える可能性がある)この問題を解決することが可能と考えられますが、私はしないでください堅実な提案があったと考えて、C++ 11は既に遅れて走っていました。

ラムダとの単相性行動の制限とそれに対する制限は、私のためのディフェンスブレーカーです。

+1

いい例! 'bind'オブジェクトは動的' foo'オブジェクトを所有しますか?それ自体はコピー不可能になりますか? –

+0

@KerrekSB絶対に、両方のアカウントで。 –

+0

@Luc素晴らしい例、私はこれを正確に探していました。残りの問題は、バインド式をstd :: function に割り当てることができないことです。これは、unique_ptrとmoveを使わなくても可能です。そのバインドをコールバックとして別の関数に渡す方法はありますか? (意図は、コールバックがオブジェクトを所有していて、コールバック自体が破棄されたらそれを削除することです)。 –

4

bindは、バインドされたメンバ関数への参照を作成するための素晴らしいです:

Foo x; 
auto f = std::bind(&Foo::bar, &x, 12, true); 
register_callback(f); 

編集:リュックダントンが示すように、この構造は非常に柔軟で、インスタンスのポインタが装いの驚くべき多様に来るようにすることができます(スマートポインタなど)[/]

実現可能であれば、ラムダはおそらく最適化の可能性が高いため、バインド式がまだ存在するため、おそらくラムダが望ましいでしょう。

(いずれにしても、autoは呼び出し可能オブジェクトを格納するタイプのためstd::function上で望ましい。)

+2

バインドは素晴らしいですが、ラムダが優れています。この 'auto f = [&x](){return x.bar(12、true); }; 'かなり簡潔です。だから、 'std :: bind'がいつ優先されるのでしょうか? –

+0

@deft_code:Hmm ... 'bind'は最後にプレースホルダを埋めます(私の' f'は引き続き多くの引数を取ることができます)ので、バインド式がどこかのテンプレートの一部であるときにはもっときれいです。しかし、それは良い質問です! –

関連する問題