[英]How do I convert boost::spirit::qi::lexeme's attribute to std::string?
考虑:
struct s {
AttrType f(const std::string &);
};
...以及具有属性AttrType
的规则r
:
template <typename Signature> using rule_t =
boost::spirit::qi::rule<Iterator,
Signature,
boost::spirit::qi::standard::space_type>;
rule_t<AttrType()> r;
r = lexeme[alnum >> +(alnum | char_('.') | char_('_'))][
_val = boost::phoenix::bind(&s::f, s_inst, _1)
];
编译时(使用clang),我收到此错误消息:
boost/phoenix/bind/detail/preprocessed/member_function_ptr_10.hpp:28:72: error: no viable conversion from
'boost::fusion::vector2<char, std::__1::vector<char, std::__1::allocator<char> > >' to 'const std::__1::basic_string<char>'
return (BOOST_PROTO_GET_POINTER(class_type, obj)->*fp)(a0);
^~
我的印象是问题是占位符变量_1
的类型。 有没有一种简洁的方法将lexeme
的属性转换为std::string
用于此目的?
如果我插入一个属性类型为std::string
的附加规则,它将编译:
rule_t<std::string()> r_str;
r = r_str[boost::phoenix::bind(&s::f, s_inst, _1)];
r_str = lexeme[alnum >> +(alnum | char_('.') | char_('_'))];
......但这看起来有点尴尬。 有没有更好的办法?
您可以使用qi::as_string[]
(如果存在合适的自动转换,则会将该属性强制转换为字符串)。
或者,您可以使用qi::raw[]
来公开source-iterator范围。 这将自动转换为std::string
属性。 这里的好处是输入可以不加改变地反映(例如qi::raw[ qi::int_ >> ';' >> qi::double_ ]
将起作用
在你的情况下,你可以使用as_string[]
。 但是你也可以修改参数来获取std::vector<char> const&
最后你可以使用attr_cast<>
来实现与单独的qi::rule<>
完全相同的效果(但不使用单独的规则:))但我不建议它的效率,因为旧版本的boost有bug在这个设施。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.