Value
usingという独自のクラスから文字列を生成しようとしていますがboost::spirit::karma
、これで行き詰まりました。私の問題を簡単な例に抽出しようとしました。
次のクラスのインスタンスから、カルマを使用して文字列を生成したいと考えています。
class Value
{
public:
enum ValueType
{
BoolType,
NumericType
};
Value(bool b) : type_(BoolType), value_(b) {}
Value(const double d) : type_(NumericType), value_(d) {};
ValueType type() { return type_; }
operator bool() { return boost::get<bool>(value_); }
operator double() { return boost::get<double>(value_); }
private:
ValueType type_;
boost::variant<bool, double> value_;
};
ここで、私がやろうとしていることを見ることができます:
int main()
{
using karma::bool_;
using karma::double_;
using karma::rule;
using karma::eps;
std::string generated;
std::back_insert_iterator<std::string> sink(generated);
rule<std::back_insert_iterator<std::string>, Value()> value_rule = bool_ | double_;
Value bool_value = Value(true);
Value double_value = Value(5.0);
karma::generate(sink, value_rule, bool_value);
std::cout << generated << "\n";
generated.clear();
karma::generate(sink, value_rule, double_value);
std::cout << generated << "\n";
return 0;
}
karma::generate()
値が bool であり、ルールの最初のジェネレーターも bool を「消費」するため、最初の呼び出しは正常に機能します。しかし、カルマが bool を食べようとして、それゆえ を呼び出すため、2 番目karma::generate()
は失敗します。boost::bad_get
Value::operator bool()
次に考えたのは、ジェネレーター ルールを変更し、ジェネレーターeps()
を条件と共に使用することでしたが、ここで行き詰まりました。
value_rule = (eps( ... ) << bool_) | (eps( ... ) << double_);
eps ジェネレーターの括弧を sth で埋めることができません。このように(もちろん動作しません):
eps(value.type() == BoolType)
入ってみましたboost::phoenix
が、私の脳はこのようなことに対して準備ができていないようです.
私を助けてください!
これが私の完全な例です(コンパイルしていますが動作していません): main.cpp