3

丸 1 年かかりましたが、私はC++ Templates - The Complete Guide by David Vandevoorde と Nicolai M. Josuttis を読み進めてきました。週間。

457 ページのセクション 22.8 の値バインダーの紹介は、理解するのに十分単純でしたが、セクションの残りの例は理解しにくいことがわかりました。具体的には、( functors/binder1.hppfunctors/binder2.hppを参照)とクラス ( functors/binderparams.hppを参照) が何を達成しようとしているの理解できません。私の問題はテンプレートの構文ではなく、これらの背後にある意図にあります。クラス。BinderBinderParams

Binderクラスはバインディングをどのように実行していますか? そして、BinderParamsクラスはどのように(?)パラメータを識別していますか? これは、私が見る/理解するのに苦労しているものです。

4

3 に答える 3

5

これは、関数 (またはファンクター) を取得し、その引数の 1 つに値を「バインド」して、1 つ少ない引数を取る新しいファンクターを取得する部分適用の実装です。

これは、一般的な関数を特定のデータと組み合わせるのに最もよく役立ちます。余分な定型コードを自分で書く必要はありません。

考えてみてください: 各要素に関数を適用してコレクションを変換し、同じサイズの新しいコレクションを作成したいとします。たとえばstd::transform、単項関数が必要です。必要なことを実行するが、より多くの引数を取る関数が既にある場合 (たとえば、AddTwoThings各要素に同じ定数を追加するだけの場合の Kerrek の関数)、次のことができます。

  • 書き直す
  • 1 つの引数を固定して最初の関数を呼び出す別の関数を作成する
  • または、 1 つの引数を固定値にバインドして、単項関数を使用できるようにすることができます。std::transform

Vandevoorde & Josuttis のシステムに相当する C++11 標準の簡単な使用法を示すいくつかの例については、驚くほど詳細なcppreference の例を参照してください。

于 2012-09-19T12:04:08.997 に答える
4

私はその本を持っていませんし、この質問に答えるために本を買いに行くつもりもありません (自己完結型になるように作り直す必要があります) が、一般的な考え方は次のようなものだと思います。

struct AddTwoThings
{
     int operator()(int a, int b) const { return a + b; }
};

typedef Binder<AddTwoThings, 0, int> AddThingToSomething;
//                           ^  ^^^
//                           |   |
//      argument position? --+   +-- bound type

AddTwoThings add2;
AddThingToSomething add10(add2, 10);

Nowは、つまりadd10(n)と同じです。add2(10, n)10 + n

于 2012-09-19T11:30:59.230 に答える
3

の署名を見てください。

template< class F, class T >
std::binder1st<F> bind1st( const F& f, const T& x );

template< class F, class T >
std::binder2nd<F> bind2nd( const F& f, const T& x );

つまり、関数bind1standbind2ndは関数と引数を取り、関数オブジェクトのbinder1standを返しますbinder2nd。これらの関数オブジェクトを呼び出すfと、最初または 2 番目の引数が に評価されて関数が呼び出されxます。

V&J で言及したセクションは、その機能の実装です。std::bindC++11 では、シグネチャを持つより一般的なものに取って代わられました。

template< class F, class... Args >
/*unspecified*/ bind( F&& f, Args&&... args );

の戻り値の型はstd::bind、変数に格納できるものですが、auto明示的に言及することはできません。バインドするパラメーターの位置、型、および値を格納する必要があるため、実装するコードは非常に複雑です。

于 2012-09-19T11:35:34.193 に答える