【问题标题】:With Boost.spirit, is there any way to pass additional argument to attribute constructor?使用 Boost.spirit,有没有办法将附加参数传递给属性构造函数?
【发布时间】:2012-08-22 14:44:03
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    没有直接的方法,但您可能可以明确地初始化事物:

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

    希望有帮助

    【讨论】:

    • 我使用的是 qi::int,而不是 int_parser。就我的理解,phoenix 可以延迟初始化,但不能添加额外的参数,那么将参数“T t”放在哪里呢?
    • 在我的示例中,它位于 construct&lt;S&gt;(...) 的 () 内(可以有多个参数)
    • 但此时 S 无法接收下一条规则解析的 int。我仍然看不到如何同时接收 T 和解析的 int 以正确构造 S 实例。
    猜你喜欢
    • 2019-06-28
    • 1970-01-01
    • 2019-07-30
    • 2022-01-03
    • 1970-01-01
    • 2017-06-20
    • 2019-12-09
    • 1970-01-01
    相关资源
    最近更新 更多