[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()を汎用化したもの。
[cpp]
#include
int main () {
Sample sample;
auto fn = std::bind(&Sample::doSomething, sample);
fn();
return 0;
}
[/cpp]
std::mem_fn()
クラスのメンバ関数(メソッド)をラップした関数オブジェクト(のようなもの)を返す機能。
戻り値は不特定の型の関数オブジェクトなので、autoかstd::functionの変数で受け取る。
なお、その関数オブジェクトの呼び出し方がやや独特で、関数オブジェクトの第1引数にクラスのインスタンスを指定する必要がある。
[cpp]
#include
int main () {
Sample sample;
auto fn = std::mem_fn (&Sample::doSomething);
fn(sample);
return 0;
}
[/cpp]
似たような名前の関数「std::mem_fun()」に注意。
まとめ
C++では関数オブジェクトの生成・ハンドリングがやりづらいという問題があったが、std::functionとラムダ関数のおかげでだいぶ使いやすくなった。
なお、以前のSTLに存在したstd::mem_fun()は、C++11から非推奨になっている。