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