Boost.Phoenix Scope-lambda

Boost.Phoenix の lambda は、式の中に式を書く時に使用します。
使い方は以下のとおり。

[ソース]

#include <boost/phoenix.hpp>
#include <boost/range/begin.hpp>
#include <boost/range/end.hpp>
#include <algorithm>
#include <iostream>
#include <vector>

struct for_each_impl{
    typedef void result_type;
    template<typename C, typename F>
    void operator ()(C& c, F f) const{
        std::for_each(boost::begin(c), boost::end(c), f);
    }
};

boost::phoenix::function<for_each_impl> const for_each = for_each_impl();

struct push_back_impl{
    typedef void result_type;
    template<typename C, typename T>
    void operator ()(C& c, T& x) const{
        c.push_back(x);
    }
};

boost::phoenix::function<push_back_impl> const push_back = push_back_impl();

int
main(){
    namespace phx = boost::phoenix;
    using phx::arg_names::arg1;
    using phx::arg_names::arg2;
    using phx::local_names::_a;
    
    int array[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    // for_each 内の arg1 と lambda 内の arg1 は別々
    for_each(arg1, phx::lambda[
        std::cout << arg1 << ","
    ])(array);
    std::cout << "\n";
    
    std::vector<int> v;
    for_each(arg1, phx::lambda(_a = arg2)[
        push_back(_a, arg1)
    ])(array, v);
    
    for_each(arg1, phx::lambda[
        std::cout << arg1 << ","
    ])(v);
    std::cout << "\n";
    
    // let に式を定義してみたり
    phx::let(_a = phx::lambda[
        arg1 + arg1
    ])[
        std::cout << phx::bind(_a, arg1) << std::endl
    ](10);

    return 0;
}

[出力]

0,1,2,3,4,5,6,7,8,9,
0,1,2,3,4,5,6,7,8,9,
20

[boost]

  • ver 1.47.0