phoenix::logical_not_op

Safe Bool Idiomを使って、string_listをbjamの変数と同じように成否判定できるようにしてみました。
要するに、

string_list a("true"), b;

if (a)
    std::cout << "if (a)" << std::endl;

if (!b)
    std::cout << "if (!b)" << std::endl;

のように書けるようになったわけです。


しかし、これをクロージャのメンバにして、

if_(!arg1)
[
    // ...
]

のようにすると、なぜかPhoenixのコード中でコンパイルエラーになります。


エラー箇所を覗いてみると、

template <typename T>
struct unary_operator<logical_not_op, T> {

    typedef T const result_type;
    static result_type eval(T const& v)
    { return !v; }
};
boost/spirit/phoenix/operators.hpp

operator!(const T&)の結果がconst Tに変換可能であることを要求していました。
これはboolの間違いだと思ったんですが、元々boolだったのが修正された跡が残っていて、よく分かりません。


とりあえず、

namespace phoenix {

struct logical_not_op;

template<typename TagT, typename T>
struct unary_operator;

template<>
struct unary_operator<logical_not_op,hamigaki::bjam::string_list>
{
    typedef bool result_type;

    static result_type eval(const hamigaki::bjam::string_list& v)
    {
        return !v;
    }
};

template<>
struct unary_operator<logical_not_op,const hamigaki::bjam::string_list>
{
    typedef bool result_type;

    static result_type eval(const hamigaki::bjam::string_list& v)
    {
        return !v;
    }
};

} // End namespace phoenix.

というインチキで回避しています。
今日の差分


う〜ん、謎です。