使用Boost.spirit,有没有办法将额外的参数传递给属性构造函数?

时间:2012-08-22 14:44:03

标签: constructor attributes boost-spirit boost-spirit-qi

也许是一个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) {
        // ...
    }
};

我花了好几天才找到解决方案,但到目前为止还没有运气。 有人可以帮忙吗?

1 个答案:

答案 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) ];

希望有所帮助