2012-07-27 129 views
25

std :: mem_funstd :: mem_fnの違いは何ですか?命名がそんなに混乱しているのはなぜですか?std :: mem_fun vs std :: mem_fn

ブーストのdocumentationはSTD :: mem_fnのは、ほとんどの場合はstd :: mem_funを置き換えることができると述べています。どのような状況であなたはまだstd :: mem_funを使用しますか?

答えて

40

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_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のような新しい特徴を使用する方が慣例だ) - 彼らは同等のC++ 03のコードに存在していたかどうstd::bind/std::mem_fnのような新しい施設が実際にメンバーを提供します。この動作に依存して、適応型ファンクタに依存する古いコードをstd::mem_fnで更新する必要があるかどうかを判断するために、あなたに任せます。

+2

'std :: not1'と' std :: not2'は、まだそれらの "適応可能な" typedefを期待しています。 – Cubbi

+0

@Cubbi:まだC++ 11の唯一の部分ですか? – Scotty

+1

@Scotty私が見た限りでは、はい、非推奨の唯一の部分です。 'std :: function'と' std :: mem_fn'から 'std :: ref'と' std :: map :: value_comp'に、これらのtypedefを使ってファンクタを作成する方法は25通りあります。 – Cubbi

関連する問題