Boost.Phoenix の if で戻り値を返す

statement の if 文では、戻り値を返すことが出来ません。
次のようなコードはエラーになります。

[エラーコード]

namespace phx = boost::phoenix;
using phx::arg_names::arg1;

// phx::if_ の戻り値型は void
boost::function<std::string(int)> f = phx::if_(arg1 >= phx::val(0))[
    phx::val("true")
]
.else_[
    phx::val("false")
];
std::string str = f(3);

このような場合は、operator の if_else を使用することで解決することが出来ます。

[ソース]

#include <boost/phoenix/core.hpp>
#include <boost/phoenix/operator.hpp>
#include <boost/function.hpp>
#include <iostream>
#include <string>

int
main(){
    namespace phx = boost::phoenix;
    using phx::arg_names::arg1;
    
    boost::function<std::string(int)> f = phx::if_else(
        arg1 >= phx::val(0),     // cond
        phx::val("true"),        // then
        phx::val("false")        // else
    );
    
    std::cout << f(3) << std::endl;
    std::cout << f(-3) << std::endl;
    std::cout << f(0) << std::endl;
    return 0;
}

[出力]

true
false
true

[boost]

  • ver 1.47.0