boost user - lambda

since: 2002-08-28 update: 2002-08-28 count:

関数プログラミング最終回、lambda。 正味全く中身を理解していません。手に余りまくりです。 サンプルコードを示します。

lambdaTest.cc

ジョークにしか見えませんね。

基本的に使うだけでいっぱいいっぱいだったのですが、 いくつか、使うコツがあったように思います。

基本的に、なんか非常識に見える部分は全て lambda functor というものに化けるみたいです。 _1 もそうだし constant('\n') もそうです。 これが左辺値に来ればこっちのもので、 後は演算子オーバーロードして次々に lambda functor を返せば良い、 と、そう、stream のトリックです。

例外的なのが stream 関係で、<< 演算子に対しては 右辺値となっても大丈夫みたいです。

つまり、std::istream << 以外で一番左に来るものは lambda 特有のものを置くようにする、というのが一つのコツになるでしょう。

また、これが一つの固まり、というような lambda functor 節は、 括弧で包むとなんかコンパイルが通りやすくなる気がします。

   std::for_each(is.begin(), is.end(), _1 = 1);

より、

   std::for_each(is.begin(), is.end(), (_1 = 1));

ということです。

サンプルコードは途中で gcc-2.96 がどうのとか書いているところまでは、 gcc-2.96 での動作を確認しました。 以降は gcc-3.0.4 で確認しましたが、gcc-2.96 でも動く部分はあると思います。

とりあえず私が一番感動したのは、

    std::for_each(is.begin(), is.end(),
                  if_(_1 % 3 == 0)[std::cout << _1 << " : 3 の倍数\n"].
                  else_[std::cout << _1 << " : 3 の倍数じゃない\n"]);

でした。

まあ、使わないのが無難でしょう。 mem_fn と bind と compose* 、iterator_adaptor で大抵のことできるんで。

ちなみにこれも使うとコンパイルが異常に遅くなります。


home / index

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

shinichiro.hamaji _at_ gmail.com / shinichiro.h