如何将 boost::spirit::qi::lexeme 的属性转换为 std::string?
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[]
。这将自动转换为std::string
属性。这里的好处是输入可以原封不动地反映(例如 qi::raw[ qi::int_ >> ';' >> qi::double_ ]
将起作用
在您的情况下,您可能可以使用 as_string[]
.但您也可以修复参数以采取std::vector<char> const&
最后,您可以使用attr_cast<>
来实现与单独qi::rule<>
完全相同的效果(但不使用单独的规则:)),但我不建议这样做是为了提高效率,因为旧版本的 boost 在此功能中有错误。
相关文章:
- c++ 构造函数 将 1 个字符串参数转换为 3 个属性
- cocos2dx 将值强制转换为属性字符串
- MFC如何将带有透明属性的PNG转换为HBITMAP
- 即使基类属性在完成向下转换时是虚拟的,是否有效
- 如果第二个属性未支撑,则将与支撑初始化器配对缩小转换
- 将单个属性类转换为属性类型
- 转换矩阵集属性
- 向向下转换结构添加属性值会导致分段错误
- 如何在C++中将结构属性转换为指针引用
- Qt DBus 属性转换为映射
- QML 引擎不隐式将布尔字符串 QVarient 转换为布尔属性
- 转换为 Unicode 时提升属性树问题
- 解析SVG转换属性的转换列表
- Boost Library函数将JSON格式的属性树转换为点分隔的字符串
- 如何使用tinyxml将xml属性转换为c++类
- 如何设置对象转换,属性
- Boost c++和属性映射-将数组转换为向量
- 将boost图中的内部属性转换为boost图的外部属性容器
- 如何将 boost::spirit::qi::lexeme 的属性转换为 std::string?
- 将属性转换为boost::变体