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