2011-07-07 9 views
4

boost::bindの会話中に、std::bind1stがC++ 03に存在することが判明しましたが、ほとんど使用できません。なぜstd :: bind1stは「ほとんど使用不可能」と考えられるのですか?

私はこれをバックアップするための何かを見つけることができません。

The boost::bind documentationは言う:

ブースト::バインドは 標準関数のstd :: bind1stのstd :: bind2ndの一般化です。任意の 関数オブジェクト、関数、関数 ポインタ、およびメンバ関数 ポインタをサポートし、任意の 引数を特定の値にバインドするか、 入力引数を任意の 位置にバインドできます。 バインドは、関数オブジェクトに何も指定しません。特に 、それは のresult_typefirst_argument_typesecond_argument_type標準 のtypedefを必要としません。おそらく、これらの制限はstd::bind1stに適用されます行うことを示唆している

std::bind1st/std::bind2ndからboost::bind利点が何であるか引数の数に明らかな制限以外に

、? std::bind1stがC++ 03で「ほとんど使えない」というアサーションにメリットはありますか?

答えて

7

C++ 03 20.3.6.1と20.3.6.2を見ると、functorの引数がbind1stの場合、結果の型が第1引数と第2引数の3つのtypedefであることがわかります。結果として得られる演算子は1つの引数しか取らないことに注意してください。

これは、を持たないため、単純な関数ポインタではbind1stを簡単に使用できないことを意味します。また、より多くのパラメータをサポートしていないため、バイナリ関数ではbind1stしか使用できません。さらに は、パラメータを並べ替えることができ、もちろん最初のものより多くをサポートできるという利点があります。

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

+1

'ptr_fun'は、指定された関数ポインタをラップするAdaptable Binary Functionを与えることで、最初の問題を解決することに注意してください。しかし、残りの部分は解決しません。 'ptr_fun'を呼び出すのは簡単ですが、やや難しいことを思い出してください;-) –

2

bind1st戻ります。これは、バインドされた関数オブジェクトと非常に厳格なC++ 03コンパイラ(より多くの最近のリリースがよりあるの参照パラメータでは動作しません

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

であることタイプの関数呼び出し演算子弛緩)。 C++ 03は参照への参照を禁じています。

+0

参照が崩壊してはいけませんか?私はtypedefsのようなものを 'const'と同じように読んでいると思います。 – Xeo

+0

@Xeo not in C++ 03。また、C++ 03とC++ 0xを区別するために、それを使用する人もいます(http://stackoverflow.com/questions/6473218/what-differences-if-any-between-c03-and-c0x-can-実行時に検出される/ 6473994#6473994)、最近のコンパイラは動作しません。 –

関連する問題