現在公開されている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;
}

もちろん、現時点では動かなくても仕方ないのは当然です。そう考えると、最初の例がけろりと動いたことに驚きです。


スポンサード リンク

この記事のカテゴリ

  • ⇒ Lamda+Oven