我开始与Boost Spirit x3解析库-我非常兴奋。我不清楚的一件事是什么时候以及为什么应该使用x3::lit。据我所知,这是因为我们不能期望像']' >> double_这样的表达式在C++语法规则中被解释为预期的。但是我的解释似乎是不正确的,因为官方文档显示了许多简单字符串后跟>>运算符的示例,以及必须将括号和/或方括号指定为lit(']')的其他示例我错过了什么?
x3::lit
']' >> double_
>>
lit(']')
thigvfpy1#
您 * 通常 * 不能期望'[' >> x看到X3表达式重载。重载解析取决于两个操作数的类型。由于'[ '是char,因此不能有用户定义的重载。因此,在这种情况下,仅如果x已经是x3分析器表达式,则会找到operator>>的x3重载。在泛型程式码中,如果两个算子都是未知的,您应该使用x3::as_parser而非x3::lit,因为这样会让其他类型的运算式保持不变,但会如您所预期地提升字串常值:
'[' >> x
'[
x
operator>>
x3::as_parser
auto combine(auto a, auto b) { return x3::as_parser(a) >> x3::as_parser(b); }
例如,'x' >> x3::double_中的过载解决机制是ADL:https://en.cppreference.com/w/cpp/language/adl(顺便说一下,这与std::cout << "Hello world\n"查找std::operator>>重载的机制相同)
'x' >> x3::double_
std::cout << "Hello world\n"
std::operator>>
1条答案
按热度按时间thigvfpy1#
您 * 通常 * 不能期望
'[' >> x
看到X3表达式重载。重载解析取决于两个操作数的类型。由于
'[
'是char,因此不能有用户定义的重载。因此,在这种情况下,仅如果x
已经是x3分析器表达式,则会找到operator>>
的x3重载。在泛型程式码中,如果两个算子都是未知的,您应该使用
x3::as_parser
而非x3::lit
,因为这样会让其他类型的运算式保持不变,但会如您所预期地提升字串常值:例如,
'x' >> x3::double_
中的过载解决机制是ADL:https://en.cppreference.com/w/cpp/language/adl(顺便说一下,这与std::cout << "Hello world\n"
查找std::operator>>
重载的机制相同)