トップページ > 関数型プログラミング >
#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
標準ライブラリの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、 と幅広くサポートしてくれます。