たぶん究極のC++ライブラリ、Lokiを使う - Functor

since: 2002-02-23 update: 2002-02-23 count:

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 とかが何なのか、ってのはサンプルコードを見て下さい。

まあ駆け足だったですがだいたいわかると思います。 実装は凄いんですが、使うぶんには簡単ですね。

サンプルコード

home / index

全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。

shinichiro.hamaji _at_ gmail.com / shinichiro.h