関数プログラミング最終回、lambda。 正味全く中身を理解していません。手に余りまくりです。 サンプルコードを示します。
ジョークにしか見えませんね。
基本的に使うだけでいっぱいいっぱいだったのですが、 いくつか、使うコツがあったように思います。
基本的に、なんか非常識に見える部分は全て 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 で大抵のことできるんで。
ちなみにこれも使うとコンパイルが異常に遅くなります。
全てリンクフリーです。 コード片は自由に使用していただいて構いません。 その他のものはGPL扱いであればあらゆる使用に関して文句は言いません。 なにかあれば下記メールアドレスへ。