std :: mem_funとstd :: mem_fnの違いは何ですか?命名がそんなに混乱しているのはなぜですか?std :: mem_fun vs std :: mem_fn
ブーストのdocumentationはSTD :: mem_fnのは、ほとんどの場合はstd :: mem_funを置き換えることができると述べています。どのような状況であなたはまだstd :: mem_funを使用しますか?
std :: mem_funとstd :: mem_fnの違いは何ですか?命名がそんなに混乱しているのはなぜですか?std :: mem_fun vs std :: mem_fn
ブーストのdocumentationは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
の両方を開発し、std::bind1st
およびstd::mem_fun
をC++ 98標準にした後に習得した。つまり、古いものを優れた代替品に置き換えるためにC++ 11まで待たなければならなかったということです。例えば
、std::mem_fun
は一つだけ、あるいはまったく引数を取るメンバ関数に対処することができます。 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
のような新しい特徴を使用する方が慣例だ) - 彼らは同等のC++ 03のコードに存在していたかどうstd::bind
/std::mem_fn
のような新しい施設が実際にメンバーを提供します。この動作に依存して、適応型ファンクタに依存する古いコードをstd::mem_fn
で更新する必要があるかどうかを判断するために、あなたに任せます。
'std :: not1'と' std :: not2'は、まだそれらの "適応可能な" typedefを期待しています。 – Cubbi
@Cubbi:まだC++ 11の唯一の部分ですか? – Scotty
@Scotty私が見た限りでは、はい、非推奨の唯一の部分です。 'std :: function'と' std :: mem_fn'から 'std :: ref'と' std :: map :: value_comp'に、これらのtypedefを使ってファンクタを作成する方法は25通りあります。 – Cubbi