web-dev-qa-db-ja.com

std :: mem_fun vs std :: mem_fn

std::mem_funstd::mem_fnの違いは何ですか?なぜ名前がそんなに紛らわしいのですか?

Boostの documentation は、ほとんどの場合、std::mem_fnstd::mem_funを置き換えることができると言っています。では、どのような状況でstd::mem_funを使用しますか?

31
Scotty

std::mem_funは非推奨です。 std::mem_fnは、実行するすべてのことを実行でき、より便利に実行できます。 2つの関係は、std::bind1st/std::bind2ndとC++ 11 std::bindの関係と同じです。 std::mem_fnstd::bindはどちらも、std::bind1ststd::mem_funがC++ 98標準に組み込まれた後に開発され、マスタリングされました。つまり、古いものを優れた代替品に適切に置き換えるには、C++ 11まで待たなければならなかったことを意味します。

たとえば、std::mem_funは、引数を1つまたはまったく取らないメンバー関数のみを処理できます。 std::mem_fnは可変個引数であり、任意の数の引数を取るメンバーを処理できます。

また、クラスオブジェクトのポインタまたは参照をそれぞれ処理するかどうかに応じて、std::mem_funstd::mem_fun_refのどちらかを選択する必要があります。 std::mem_fnだけでもどちらにも対応でき、スマートポインタのサポートも提供します。

boost::mem_fnのドキュメントでは、いつstd::mem_funを使用するかを説明しています。簡単に言うと、std::mem_funを期待するコード、または適応可能なファンクターを期待するコードを操作する必要がある場合です(これはC++ 03)。そのような場合、std::mem_fnもプラグインできないので、そこにあります。レガシーにはstd::mem_funを使用します。

*:つまり、新しいコードは、C++ 03プロトコルに依存してはいけません。 result_typeメンバータイプ(std::result_ofのような新しい特性を使用するのがより一般的です)-std::bind/std::mem_fnのような新しい機能は、実際にそれらのメンバーを提供します。同等のC++ 03コードで存在していました。この動作に依存することにより、適応可能なファンクターに依存する古いコードをstd::mem_fnで更新する必要があるかどうかを判断するのはあなたに任せます。

47
Luc Danton