我是从Boost Spirit x3解析库开始的--我对此感到非常兴奋。
有一件事我不清楚,那就是何时以及为什么要使用x3::lit。
据我所知,这是因为我们不能期望像']' >> double_这样的表达式在C++语法规则中被解释为意图。
但是,我的解释似乎不正确,因为正式文档显示了许多简单字符串的示例,后面跟着>>运算符,还有一些例子必须将括号和/或方括号指定为lit(']')。
我遗漏了什么?
发布于 2022-11-15 16:52:01
您通常不能期望'[' >> x看到X3表达式重载。
过载解析取决于两个操作数的类型。因为'[‘是char,所以不能有用户定义的重载。因此,在本例中,仅,如果x已经是x3解析器表达式,则会找到operator>>的x3重载。
在泛型代码中,如果两个操作数都是未知的,则应该使用x3::as_parser而不是x3::lit,因为它将保留其他类型的表达式,但会像您预期的那样促进字符串文本:
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>>重载的机制是相同的)
https://stackoverflow.com/questions/74440855
复制相似问题