spirit x3不能传播可选<vector>类型的属性

时间:2017-03-29 09:20:33

标签: c++ boost boost-spirit boost-spirit-qi boost-spirit-x3

Coliru上的简单解析器。解析器-(+x3::alpha)应该能够像Qi一样传播boost::optional<std::string>类型的属性。但它没有编译。

std::string const input = "abc";
boost::optional<std::string> attr;
if(x3::parse(boost::begin(input),boost::end(input),
    -(+x3::alpha),
    attr)) {
    std::cout<<"match!"<<std::endl;
}
else {
    std::cout<<"NOT match!"<<std::endl;
}

1 个答案:

答案 0 :(得分:3)

我不认为规范性主张应该像Qi一样能够做到这一点。削减木材。 X3不是Qi的演变,原因很充分(比如这个)。

经常出现的模式是在更复杂的传播场景中需要类型提示。丑陋的冗长方式可能是这样的:

    -(x3::rule<struct _, std::string> {} = +x3::alpha),

<强> Live On Coliru

或者你可以使用hack I described previously

namespace {
    template <typename T>
    struct as_type {
        template <typename Expr>
            auto operator[](Expr&& expr) const {
                return x3::rule<struct _, T>{"as"} = x3::as_parser(std::forward<Expr>(expr));
            }
    };

    template <typename T> static const as_type<T> as = {};
}

<强> Live On Coliru