spirit x3 无法传播可选类型的属性<vector>
spirit x3 cannot propagate attributes of type optional<vector>
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;
}
我认为规范性声明 "should be able [...] as Qi does" 不切实际。 X3 不是 Qi 的进化,有很好的理由(比如这个)。
一个经常出现的模式是在更复杂的传播场景中需要类型提示。丑陋冗长的方式可能是这样的:
-(x3::rule<struct _, std::string> {} = +x3::alpha),
或者您可以使用 hack :
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 = {};
}
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;
}
我认为规范性声明 "should be able [...] as Qi does" 不切实际。 X3 不是 Qi 的进化,有很好的理由(比如这个)。
一个经常出现的模式是在更复杂的传播场景中需要类型提示。丑陋冗长的方式可能是这样的:
-(x3::rule<struct _, std::string> {} = +x3::alpha),
或者您可以使用 hack
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 = {};
}