How to convert boost :: spirit :: qi :: lexeme attribute to std :: string?

Consider:

struct s {
  AttrType f(const std::string &);
};

... and the rule rwith the attribute AttrType:

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

When compiling this (with clang), I get this error message:

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);
                                                                       ^~

It seems to me that the problem - it is the type of variable-filler _1. Is there a condensed way of converting an attribute lexemein std::stringfor this purpose?

If I insert an additional rule with an attribute type std::string, it compiles:

rule_t<std::string()> r_str;

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

... but it seems a little uncomfortable. Is there a better way?

+4
source share
1 answer

You can use qi::as_string[](which will force the attribute to a string if a suitable automatic conversion exists).

qi::raw[], -. std::string. , (, qi::raw[ qi::int_ >> ';' >> qi::double_ ]

, , as_string[]. , std::vector<char> const&


, attr_cast<> , qi::rule<> ( :)), boost .

+3

All Articles