[C++11] STL:std::bind()とstd::mem_fn()の違い:std::functionで受ければ同じこと

2015 年 7 月 15 日 Categories: C++ |

いずれも、関数オブジェクト(のようなもの)を扱えるようにする点においては変わりない。

また、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から非推奨になっている。