gpt4 book ai didi

c++ - 如何将 boost::spirit::qi::lexeme 的属性转换为 std::string?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:11 26 4
gpt4 key购买 nike

考虑:

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[]它公开了源迭代器范围。这将自动转换为 std::string属性。这里的好处是输入可以不加改变地反射(reflect)出来(例如 qi::raw[ qi::int_ >> ';' >> qi::double_ ] 将起作用

在您的情况下,您可能可以使用 as_string[] .但您也可以修复参数以采用 std::vector<char> const&


最后你可以使用attr_cast<>达到与单独的 qi::rule<> 完全相同的效果(但不使用单独的规则 :))但我不推荐它以 boost 效率,因为旧版本的 boost 在此工具中存在错误。

关于c++ - 如何将 boost::spirit::qi::lexeme 的属性转换为 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30784591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com