我正在尝试从我自己的名为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()
工作正常,因为该值是一个布尔值,并且我的规则中的第一个生成器也“消耗”了一个布尔值。但是第二个karma::generate()
失败了,boost::bad_get
因为 karma 试图吃一个 bool 并因此调用Value::operator bool()
。
我的下一个想法是修改我的生成器规则并将eps()
生成器与条件一起使用,但在这里我卡住了:
value_rule = (eps( ... ) << bool_) | (eps( ... ) << double_);
我无法用 sth 填充 eps 生成器的括号。像这样(当然不工作):
eps(value.type() == BoolType)
我试图进入boost::phoenix
,但我的大脑似乎还没有为这样的事情做好准备。
请帮我!
这是我的完整示例(编译但不工作): main.cpp