34

std::mem_funとはどう違いstd::mem_fnますか?なぜネーミングが混乱するのか?

Boost のドキュメントによると、ほとんどの場合std::mem_fnに置き換えることができます。std::mem_funでは、どのような状況で引き続き を使用しstd::mem_funますか?

4

1 に答える 1

52

std::mem_fun廃止されました。std::mem_fnそれがするすべてを行うことができ、それをより便利にします。両者の関係はstd::bind1st/std::bind2ndと C++11の関係と同じstd::bindです。std::mem_fnとは両方とも、後にstd::bind開発および習得され、C++98 標準になりました。つまり、古いものを優れた代替品に適切に置き換えるには、C++11 まで待つ必要がありました。std::bind1ststd::mem_fun

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

また、クラス オブジェクトのポインターまたは参照を (それぞれ) 処理するかどうかに応じてstd::mem_fun選択する必要があります。単独でどちらにも対処でき、スマート ポインターのサポートも提供します。std::mem_fun_refstd::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

于 2012-07-27T03:02:39.273 に答える