std::mem_fun
とstd::mem_fn
の違いは何ですか?なぜ名前がそんなに紛らわしいのですか?
Boostの documentation は、ほとんどの場合、std::mem_fn
がstd::mem_fun
を置き換えることができると言っています。では、どのような状況でstd::mem_fun
を使用しますか?
std::mem_fun
は非推奨です。 std::mem_fn
は、実行するすべてのことを実行でき、より便利に実行できます。 2つの関係は、std::bind1st
/std::bind2nd
とC++ 11 std::bind
の関係と同じです。 std::mem_fn
とstd::bind
はどちらも、std::bind1st
とstd::mem_fun
がC++ 98標準に組み込まれた後に開発され、マスタリングされました。つまり、古いものを優れた代替品に適切に置き換えるには、C++ 11まで待たなければならなかったことを意味します。
たとえば、std::mem_fun
は、引数を1つまたはまったく取らないメンバー関数のみを処理できます。 std::mem_fn
は可変個引数であり、任意の数の引数を取るメンバーを処理できます。
また、クラスオブジェクトのポインタまたは参照をそれぞれ処理するかどうかに応じて、std::mem_fun
とstd::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
で更新する必要があるかどうかを判断するのはあなたに任せます。