3

也许是一个菜鸟问题,我有一段这样的代码:

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) {
        // ...
    }
};

我花了几天时间寻找解决方案,但到目前为止还没有运气。任何人都可以帮忙吗?

4

1 回答 1

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

希望有帮助

于 2012-08-22T19:10:43.897 回答