std::mem_fun
とはどう違いstd::mem_fn
ますか?なぜネーミングが混乱するのか?
Boost のドキュメントによると、ほとんどの場合std::mem_fn
に置き換えることができます。std::mem_fun
では、どのような状況で引き続き を使用しstd::mem_fun
ますか?
std::mem_fun
とはどう違いstd::mem_fn
ますか?なぜネーミングが混乱するのか?
Boost のドキュメントによると、ほとんどの場合std::mem_fn
に置き換えることができます。std::mem_fun
では、どのような状況で引き続き を使用しstd::mem_fun
ますか?
std::mem_fun
廃止されました。std::mem_fn
それがするすべてを行うことができ、それをより便利にします。両者の関係はstd::bind1st
/std::bind2nd
と C++11の関係と同じstd::bind
です。std::mem_fn
とは両方とも、後にstd::bind
開発および習得され、C++98 標準になりました。つまり、古いものを優れた代替品に適切に置き換えるには、C++11 まで待つ必要がありました。std::bind1st
std::mem_fun
たとえば、std::mem_fun
1 つまたは 1 つの引数を取らないメンバー関数のみを処理できます。std::mem_fn
可変長であり、任意の数の引数を取るメンバーを処理できます。
また、クラス オブジェクトのポインターまたは参照を (それぞれ) 処理するかどうかに応じてstd::mem_fun
選択する必要があります。単独でどちらにも対処でき、スマート ポインターのサポートも提供します。std::mem_fun_ref
std::mem_fn
のドキュメントでboost::mem_fn
は、 をいつ使用するかを説明しています。簡単に言えば、それは、 を期待するコード、または適応可能なファンクター (C++03 からの廃止された概念*) をstd::mem_fun
期待するコードで操作する必要がある場合です。std::mem_fun
これらのケースでは、プラグインもできないため、レガシーstd::mem_fn
に使用します。std::mem_fun
*: つまり、新しいコードは、たとえばresult_type
メンバー型を持つ C++03 プロトコルに依存すべきではないということです ( のような新しいトレイトを使用する方が一般的ですstd::result_of
) -- std::bind
/のような新しい機能std::mem_fn
は、実際には、それらは、同等の C++03 コードに存在していたはずです。この動作に依存して、適応可能なファンクターに依存する古いコードを更新する必要があるかどうかを判断するのはあなたに任せますstd::mem_fn
。