Boost.Phoenix で、const でない関数オブジェクトを bind する

そのまま渡したらエラーになりました。
phx::ref でラップする必要があるみたいです。

[ソース]

#include <boost/phoenix.hpp>
#include <iostream>

struct disp{
    disp() : count(1){}
    void operator ()(){
        for(int i = 0 ; i < count ; ++i){
            std::cout << "homu";
        }
        std::cout << "\n";
        ++count;
    }
private:
    int count;
};

int
main(){
    namespace phx = boost::phoenix;
    using phx::arg_names::arg1;
    disp d;
//  phx::bind(d)();        // error
    phx::bind(phx::ref(d))();
    phx::bind(phx::ref(d))();
    phx::bind(phx::ref(d))();
    phx::bind(phx::ref(d))();

    return 0;
}

[出力]

homu
homuhomu
homuhomuhomu
homuhomuhomuhomu

言われてみれば当たり前の様な気がしますが、ハマったので覚え書き。

[boost]

  • ver 1.47.0