gpt4 book ai didi

c++ - Boost Qi/X3 解析的类型安全

转载 作者:行者123 更新时间:2023-12-02 10:12:31 28 4
gpt4 key购买 nike

考虑使用 Boost Spirit X3 的这段代码(Boost Spirit Qi 在概念上也是如此):

  string command;
string value;
x3::parse(command.begin(), command.end(), "float:" >> x3::double_, value);
为什么这段代码在编译过程中没有产生任何错误?不应该 "float:" >> x3::double_解析器具有类型 double 的属性因此不接受 std::string作为 parse 的第四个参数?
顺便说一句,我知道我可以这样做:
string value;
auto assign = [](auto& ctx){value = _attr(ctx)};
x3::parse(command.begin(), command.end(), "float:" >> x3::double_[assign], value)
这会产生错误,但它比必要的更复杂。
作为最后的手段:任何有名的 sscanf 替代品那将是类型安全的(可能在 boost 中)?

最佳答案

这是因为将属性自动传播到容器中非常灵活。
std::string是一个容器。
也许如果我们做以下实验,它会更有意义:
Live On Coliru

#include <boost/spirit/home/x3.hpp>
#include <iostream>
namespace x3 = boost::spirit::x3;

int main() {
//std::string command = "f: hello world";
std::string command = "f: 104 101 108 108 111 32 119 111 114 108 100";
std::string value;
x3::phrase_parse(
command.begin(),
command.end(),
"f:" >> *x3::double_, x3::blank,
value);

std::cout << value << "\n";
}
正如您可能猜到的那样,它会打印:
hello world
对于字符串,这似乎令人惊讶。如果目标是 std::vector<float>,那就不足为奇了。 - 但它需要完全相同的转换量。
每个元素享受传播转换是公平的。如果您正在解析 Ast 节点,例如:
struct Operation {
Operator op;
std::vector<Expression> operands;
}
如果操作数没有隐式转换为 Expression,你会讨厌来自 Unary , FunctionCall , StringLiteral等等。

关于c++ - Boost Qi/X3 解析的类型安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62986317/

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