Functor は Loki の中では異色なのかな?ポリシーも無いし。
Commandパターンのジェネリックな実装です。 Commandパターンってのはオブジェクト指向版関数ポインタって感じかな。
特に説明もへったくれもありません。 サンプルコードを見てもらえればわかると思うんですが。 まあでも一応。基本的には、
Class c; Loki::Functor<void> cmd1(func); Loki::Functor<void, TYPELIST_1(bool)> cmd2(uFunc); Loki::Functor<void, TYPELIST_2(bool, bool)> cmd9(&c, &Class::biFunc);
って感じ。たぶんこんな一時変数につっこむんじゃなくて コンテナに突込んで処理するんでしょう。 例えば std::vector にいっぱい突込んでまとめて実行するとか、 std::map<std::string, Loki::Functor> に突込んで、 文字列に対応した関数を実行するとか。
んで関数オブジェクトも入るよ、ってことで、
Loki::Functor<void, TYPELIST_1(Class*)> cmd16(std::mem_fun(&Class::func)); Loki::Functor<void, TYPELIST_2(Class*, bool)> cmd17(std::mem_fun(&Class::uFunc)); Loki::Functor<void, TYPELIST_1(bool)> cmd18(std::ptr_fun(uFunc)); std::equal_to<int> eq; Loki::Functor<bool, TYPELIST_2(int, int)> cmd19(eq);
と、STL の諸々を突っ込むこともできます …が、あんまり役にたたなさそうです。 Functor はメンバ関数のクラスを渡すタイミングを遅延できないので、 mem_fun に関しては、少しは使えるのかな、 とも思いますがどうなんだろう。 ていうかそもそも mem_fun みたいに
Loki::Functor<void, TYPELIST_1(Class*)> cmd(&Class::func);
なんてできてもいいと思うんですが…
あとは Bind と Chain 。これも問題無いでしょう。
Loki::Functor<void, TYPELIST_1(bool)> cmd20(Loki::BindFirst(cmd3, true)); Loki::Functor<void> cmd21(Loki::BindFirst(cmd20, true)); Loki::Functor<void> cmd22(Loki::Chain(cmd1, cmd7)); Loki::Functor<void, TYPELIST_1(bool)> cmd23(Loki::Chain(cmd2, cmd8));
cmd3 とか cmd7 とかが何なのか、ってのはサンプルコードを見て下さい。
まあ駆け足だったですがだいたいわかると思います。 実装は凄いんですが、使うぶんには簡単ですね。
サンプルコード全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。