現在公開されているVC++ 10のCTP(≒開発中体験版)では、ラムダ関数が使えるということで試してみました。ラムダ関数、つまりその場で書ける無名関数ですが、自分は何よりPStade.Ovenと組み合わせて使いたいと思っていました。というわけで、以前PStade.OvenにBoost.Lambdaを使っていたプログラムをラムダ関数に置き換えてみました。
#include <iostream> #include <boost/range/algorithm.hpp> //range_exの新版 #include <pstade/oven/dropped.hpp> #include <pstade/oven/dropped_while.hpp> #include <pstade/oven/as_c_str.hpp> int main(int argc, char** argv) { using namespace pstade::oven; boost::copy(argv[1] | as_c_str | dropped_while([](char c) {return c != '/';}), std::ostream_iterator<char>(std::cout, "")); std::cout << std::endl; return 0; } |
うーん、これくらいだと、下手したらBoost.Lambdaのほうが簡潔かもしれないと思ってしまいます。
まあ、気を取り直して、ほかにも書いてみようと思ったのですが、ほとんどの場合でコンパイルエラーになりました。上のようにうまくいった例のほうが貴重です。例えば、次のプログラムも、functionを使わずに直接ラムダ関数を書くとエラーになってコンパイルできません。
#include <iostream> #include <cstdlib> #include <boost/range/algorithm.hpp> #include <pstade/oven/transformed.hpp> #include <pstade/oven/taken.hpp> #include <pstade/oven/generation.hpp> #include <functional> int main() { using namespace pstade::oven; std::srand(std::time(0)); std::tr1::function<int (int)> f = [](int x) {return x % 10;}; boost::copy( generation(nonstop(&std::rand)) | transformed(f) | taken(30) , std::ostream_iterator<int>(std::cout, " ")); std::cout << std::endl; } |
もちろん、現時点では動かなくても仕方ないのは当然です。そう考えると、最初の例がけろりと動いたことに驚きです。
スポンサード リンク |
この記事のカテゴリ
- C++ ⇒ Lamda+Oven
> functionを使わずに直接ラムダ関数を書くとエラーになってコンパイルできません。
C++0xのラムダ式が現状、result_typeを持ってないからですね。
transformedはresult_typeないと実装できないので。