也许是一个noob问题,我有一段这样的代码:
struct S {
S() {...}
S(int v) {
// ...
}
};
qi::rule<const char*, S(), boost::spirit::ascii::space_type> ip=qi::int_parser<S()>();
qi::rule<const char*, std::vector<S>(), boost::spirit::ascii::space_type> parser %= ip % ',';
...
上述规则可以使用,但如果S构造函数需要其他参数,则代码会中断,例如:
struct S {
S(T t) {...}
S(T t, int v) {
// ...
}
};
我花了好几天才找到解决方案,但到目前为止还没有运气。 有人可以帮忙吗?
答案 0 :(得分:2)
没有直接的方法,但你可能会明确地初始化事物:
qi::rule<It, optional<S>(), Skipper> myrule;
myrule %=
qi::eps [ _val = phoenix::construct<S>(42) ] >>
int_parser<S()>;
但是,既然你是从int_parser返回它,我的直觉说默认初始化应该是合适的(或者类型S没有单一的,明确的责任?)。
在回复评论时,看起来你想要这个:
T someTvalue;
myrule = qi::int_
[ qi::_val = phx::construct<S>(someTvalue, qi::_1) ];
或者,如果someTvalue
是语法构造函数之外的变量,并且可能在执行解析器期间更改值(并且它的寿命足够长!),您可以
myrule = qi::int_
[ qi::_val = phx::construct<S>(phx::ref(someTvalue), qi::_1) ];
希望有所帮助