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.
というインチキで回避しています。
今日の差分
う〜ん、謎です。