boost::mem_fn

トップページ > 関数型プログラミング >

abstract

必要なヘッダ
<boost/mem_fn.hpp>
出来ること
メンバ関数を普通の関数っぽく直す
リファレンス
en / jp

sample

#include <iostream>
#include <vector>
#include <algorithm>
#include <boost/mem_fn.hpp>
using namespace std;

struct SomeObject
{
public:
	SomeObject( const char* i_name ) : name( i_name ) {}
	void Print() { cout << name << endl; }
private:
	const char* name;
};

int main()
{
	vector<SomeObject> v;
	v.push_back(SomeObject("Taro"));
	v.push_back(SomeObject("Jiro"));
	v.push_back(SomeObject("Saburo"));
	v.push_back(SomeObject("Shiro"));
	v.push_back(SomeObject("Goro"));

	// std::mem_fun_ref のかわり
	for_each( v.begin(), v.end(), boost::mem_fn(&SomeObject::Print) );
	cout << "--------------" << endl;

	vector<SomeObject*> vp;
	vp.push_back(new SomeObject("Rokuro"));
	vp.push_back(new SomeObject("Shichiro"));
	vp.push_back(new SomeObject("Hachiro"));
	vp.push_back(new SomeObject("Kuro"));

	// 全く同じ形で
	// std::mem_fun のかわりとしても使える。
	for_each( vp.begin(), vp.end(), boost::mem_fn(&SomeObject::Print) );

	// ToDo: delete...(^^;
	return 0;
}

出力例

Taro
Jiro
Saburo
Shiro
Goro
--------------
Rokuro
Shichiro
Hachiro
Kuro

etc

標準ライブラリのmem_funを用いると、ptr->Func()mem_fun(&Class::Func)( ptr ) と書き換えることができます。 この形にしておくと for_each などのアルゴリズムを、 メンバ関数に対しても利用できるようになって便利です。 ただしこいつは、obj.Func() の場合は mem_fun_ref(&Class::Func)( obj ) と、別の mem_fun_ref なる関数を使う必要があったり、引数を取らない関数にしか使えなかったりと、 実は結構柔軟性に欠けます。そこでboost::mem_fn。

mem_fnという一つの名前で、 ポインタ版と参照版、const有りと無し、引数の数は2個以上でもOK、 と幅広くサポートしてくれます。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0