今一つ過度なサービス感が拭えない、function。 私の勘違いなんだろうか?
要は便利便利関数ポインタです。 C形式の関数ポインタなんて書けるまでにどれだけ時間がかかったか。 それを随分楽な形式で書けるといわけです。
void func(int i, int j) {} boost::function<void, int, int> f1 = func;
さらに関数オブジェクトも収納できる、ああ便利。
class Class { public: void func1(int i) {} }; boost::function<void, Class*, int> f2 = boost::bind(&Class::func1, _1, _2); boost::function<void, int> f3 = boost::bind(&Class::func1, &c, _1); boost::function<void, Class*> f4 = boost::bind(&Class::func1, _1, 1); boost::function<int, int, int> f5 = std::plus<int>();
とまあ、ここで終われば世の中便利になったのお、 と思って終わりなのですが、function にはなんかまだ機能がついています。
とりあえず役に立ちそうな policy から。
void now() { std::cout << " now "; } struct print_policy { void precall(const boost::function_base*) { std::cout << " before "; } void postcall(const boost::function_base*) { std::cout << " after " << std::endl; } };
なんて定義があって、
boost::function<void>::policy<print_policy>::type f6 = now; f6();
とかすると、おお、期待通り " before now after \n" が出力されました、と。 ただインターフェイスが謎なんだよなあ。 func.set_precall なんてのではダメだったのか、 んー、これはコンパイルタイムに決定するとは限らないと思うんですけど。 policy っていう命名も謎だし。
後二つ、mixin と allocator を指定できる機能がありますが、 めんどくさいし、多分誰も使わないんじゃないかなあ、と思うので省略。 mixin は policy に状態を持たせるのに使っているサンプルがありました。 なんか直感的じゃないなあ。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。