C++ 如何转换boost::spirit::qi::lexeme';std::string的属性?

C++ 如何转换boost::spirit::qi::lexeme';std::string的属性?,c++,boost,boost-spirit,boost-spirit-qi,boost-phoenix,C++,Boost,Boost Spirit,Boost Spirit Qi,Boost Phoenix,考虑: struct s { AttrType f(const std::string &); }; …以及带有属性的规则r: template <typename Signature> using rule_t = boost::spirit::qi::rule<Iterator, Signature, boost::spirit::qi::standar

考虑:

struct s {
  AttrType f(const std::string &);
};
…以及带有属性的规则
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)
    ];

……但这似乎有点尴尬。有更好的方法吗?

您可以使用
qi::as_string[]
(如果存在合适的自动转换,这将强制将属性转换为字符串)

或者,您可以使用公开源迭代器范围的
qi::raw[]
。这将自动转换为
std::string
属性。这里的好处是,输入可以不加更改地反映出来(例如,
qi::raw[qi::int_>>”;“>>qi::double_>>”
将起作用

在您的例子中,您可能可以使用
作为字符串[]
。但是您也可以修复参数以获取
std::vector常量&



最后,您可以使用
attr\u cast
实现与单独的
qi::rule
(但不使用单独的规则:)完全相同的效果,但出于效率考虑,我不推荐使用它,因为旧版本的boost在此功能中存在bug。

as\u string
似乎正是我想要的。谢谢
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);
                                                                       ^~
rule_t<std::string()> r_str;

r = r_str[boost::phoenix::bind(&s::f, s_inst, _1)];
r_str = lexeme[alnum >> +(alnum | char_('.') | char_('_'))];