Boost.Phoenix で、2つ以上の式を呼び出す
Boost.Phoenix では、phoenix::bind と カンマ演算子を使用して、2つ以上の式を呼び出すことが出来ます。
[ソース]
#include <boost/phoenix.hpp> #include <boost/range/irange.hpp> #include <boost/range/algorithm/for_each.hpp> #include <iostream> void disp(int n){ std::cout << n << std::endl; } int main(){ namespace phx = boost::phoenix; using phx::arg_names::arg1; // カンマ演算子で、複数の式を書く ( phx::bind(&disp, arg1), phx::bind(&disp, arg1 + arg1) )(10); int sum = 0; boost::for_each(boost::irange(0, 10), ( std::cout << arg1 << ",", phx::ref(sum) += arg1 )); std::cout << "\n"; std::cout << sum << std::endl; return 0; }
[出力]
10 20 0,1,2,3,4,5,6,7,8,9, 45
[注意1]
Boost.Bind や 関数オブジェクトなどをそのまま書いても評価されないので、boost::phoenix::bind を使用する必要があります。
namespace phx = boost::phoenix; void disp(int n){ std::cout << n << std::endl; } struct hoge{ typedef void result_type; void operator()() const{ std::cout << "hoge" << std::endl; } }; ( boost::bind(&disp, _1), // 呼ばれない hoge(), // 呼ばれない phx::bind(&disp, arg1), // 呼ばれる phx::bind(hoge()) // 呼ばれる )(10); /* result 10 hoge */
[注意2]
msvc2010 だと標準出力の処理が、2つ目以降にあるとコンパイルエラーになりました。
gcc や clang だと問題なかったので、Boost.Phoenix のバグっぽい?
// error ( arg1 + arg1, std::cout << arg1 << std::endl // 2つ目に書く )(10); // ok ( std::cout << arg1 << std::endl, // 最初に書く arg1 + arg1 )(10);
[boost]
- ver 1.47.0