[C++11] STL:std::bind()とstd::mem_fn()の違い:std::functionで受ければ同じこと
いずれも、関数オブジェクト(のようなもの)を扱えるようにする点においては変わりない。
また、std::functionで受ければ、その後の扱いはほとんど同じ。
std::bind()、std::mem_fn()、そしてstd::functionのいずれも、「functional」のヘッダファイルをインクルードする。
std::bind()
その名のとおり、特定の関数を束縛(固定)した関数オブジェクトを返す機能。グローバル関数でも、関数ポインタでも、メンバ関数ポインタでも受け取ることができる。
引数の位置を入れ替えることも可能。
戻り値は不特定の型の関数オブジェクトなので、autoかstd::functionの変数で受け取る。
元々はBoostライブラリにあったもので、std::bind1()、std::bind2()を汎用化したもの。
#include <functional> int main () { Sample sample; auto fn = std::bind(&Sample::doSomething, sample); fn(); return 0; }
std::mem_fn()
クラスのメンバ関数(メソッド)をラップした関数オブジェクト(のようなもの)を返す機能。
戻り値は不特定の型の関数オブジェクトなので、autoかstd::functionの変数で受け取る。
なお、その関数オブジェクトの呼び出し方がやや独特で、関数オブジェクトの第1引数にクラスのインスタンスを指定する必要がある。
#include </functional><functional> int main () { Sample sample; auto fn = std::mem_fn (&Sample::doSomething); fn(sample); return 0; }
似たような名前の関数「std::mem_fun()」に注意。
まとめ
C++では関数オブジェクトの生成・ハンドリングがやりづらいという問題があったが、std::functionとラムダ関数のおかげでだいぶ使いやすくなった。
なお、以前のSTLに存在したstd::mem_fun()は、C++11から非推奨になっている。