4

での会話中に、は C++03 に存在するが、「ほとんど使用できない」boost::bindことが指摘されました。std::bind1st

これを裏付ける確かなものが見つかりません。

boost::bindドキュメントには次のように記載されています。

boost::bindは、標準関数std::bind1stおよび std::bind2ndの一般化です。任意の関数オブジェクト、関数、関数ポインター、およびメンバー関数ポインターをサポートし、任意の引数を特定の値にバインドしたり、入力引数を任意の位置にルーティングしたりできます。bindは、関数オブジェクトに要件を課しません。特に、 result_typefirst_argument_typesecond_argument_type標準の typedefは必要ありません 。

おそらく、これらの制限が に適用されることを示唆していますstd::bind1st

引数の数に関する明らかな制限以外に、to /の利点はですか? C++03で「ほとんど使えない」という主張に何かメリットはあるのでしょうか?boost::bindstd::bind1ststd::bind2ndstd::bind1st

4

2 に答える 2

7

C ++ 03 20.3.6.1と20.3.6.2を見ると、ファンクター引数には3つのs(結果タイプ、最初と2番目の引数)のbind1st要件があり、結果の演算子のみが必要であることがわかります。 typedef1つの引数を取ります。

つまり、単純な関数ポインタにはsbind1stがないため、単純に関数ポインタを簡単に使用することはできませんtypedefbind1stまた、これ以上のパラメーターはサポートされていないため、バイナリ関数でのみ使用できます。さらに、 boost::bind et alには、パラメータを並べ替えることができるという利点があり、もちろん、最初のパラメータ以上のものをサポートします。

バインダーのほとんどのユースケースは、フリー関数とメンバー関数であり、ファンクターオブジェクトではないようです。そのため、の使用bind1stは非常に制限されています(ただし、のような他のツールを使用して拡張できますがptr_fun、これによってより使いやすくなるかどうかは疑問です)。もちろん、これは個人的な経験にのみ基づいていますが、誰かがのGoogleコード検索統計を実行したい場合がありますbind1st

于 2011-07-07T10:56:37.407 に答える
2

bind1st返す型の関数呼び出し演算子は

typename Operation::result_type
operator()(const typename Operation::second_argument_type& x) const;

これは、バインドされた関数オブジェクトの参照パラメーターと非常に厳密な C++03 コンパイラでは機能しません (最近のリリースはより緩いです)。C++03 では、参照への参照が禁止されています。

于 2011-07-07T11:18:06.797 に答える