比較と対照: C 0x の std::bind とラムダ
C 0x では、プログラマは、関数: std::bind とラムダ。どちらも異なる目的を果たしますが、一部のアプリケーションでは重複します。交差する機能の例を取り上げて、それぞれのアプローチの長所と制限を詳しく見てみましょう。
サイコロを振る関数を作成するタスクを考えてみましょう。ラムダを使用すると、これを次のように表現できます。
<code class="cpp">auto dice = [&]() { return distribution(engine); };</code>
また、std::bind を使用すると、次のように記述できます。
<code class="cpp">auto dice = bind(distribution, engine);</code>
モノモーフィック vs. ポリモーフィック
基本的な違いの 1 つは、型の動作にあります。ラムダは単相的です。つまり、コンパイル時に決定される固定の引数の型を持ちます。この制約により、対応するバインドに比べてラムダの柔軟性が制限されます。
たとえば、2 つの引数を出力する関数を考えてみましょう。
<code class="cpp">auto f = [](auto a, auto b) { cout << a << ' ' << b; }
このラムダを異なるパラメータ型で使用すると、コンパイラエラー。対照的に、std::bind ではポリモーフィックな動作が可能であり、関数をさまざまな型の引数にバインドできます。
<code class="cpp">struct foo { template <typename A, typename B> void operator()(A a, B b) { cout << a << ' ' << b; } }; auto f = bind(foo(), _1, _2);</code>
関数が呼び出されるまで型推定を延期することで、std::bind はより高い柔軟性を提供します。多様な入力タイプを処理するため。
以上がいつ選択するか: std::bind と C 0x のラムダ?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。