TR1ネタついで。
囚人さんがちょい前に紹介してた超汎用関数ポインタ: function。
こいつとbindとのコンビネーションで大抵の関数/メソッドを
関数オブジェクト化できるです。
#include <iostream>
#include <boost/tr1/functional.hpp>
using namespace std;
int add(int x, int y) { return x + y; }
int time2(int x) { return add(x,x); }
struct bias {
int value_;
bias(int n) : value_(n) {}
int value(int x) const {
return value_ + x;
}
};
int main() {
// fはintを引数とし、intを返す
tr1::function<int (int)> f;
f = &time2;
cout << f(3) << endl; // 3+3 = 6
// placeholder名前空間を開放し、_1 を使えるように
using namespace std::tr1::placeholders;
// addの第二引数を4に固定
f = tr1::bind(&add, _1, 4);
cout << f(3) << endl; // 3+4 = 7
bias b(10);
// bias::valueのレシーバをbに固定
f = tr1::bind(&bias::value, &b, _1);
cout << f(2) << endl; // b.value(2) = 12
}