gpt4 book ai didi

c++ - AST : get leaf value when leafs are of different types

转载 作者:行者123 更新时间:2023-11-27 22:34:46 26 4
gpt4 key购买 nike

我需要在 AST 中表示这样的结构:

struct {
int data;
double doubleDataArray[10];
struct {
int nestedData;
};
};

我正在创建这样的 AST:

enter image description here

我需要从树叶中检索数据。我遇到的问题是叶子包含异构数据。叶子可以表示整数值、 double 值、字符串等。

我可以创建继承自 ValueIntValueDoubleValue 类并存储各自的数据,执行 dynamic_castValue 转换为其 type 属性中引用的类型。有点像

switch (value->getType()) {
case Type::Int: {
auto iv = dynamic_cast<IntValue>(value);
int value = iv->getValue();
} break;
case Type::Double() {
auto dv = dynamic_cast<DoubleValue>(value);
double value = dv->getValue();
} break;
//…
}

但我想知道是否有更好的方法,因为像那样的开关不容易维护和阅读。

我看过一些例子,比如在 boost::program_options 中,是这样的:

int value = value->getValue().as<int>();

这是更好的方法吗?我怎样才能重现这个?

最佳答案

你可以使用 c++17 做这样的事情

struct node {
//... other stuff
std::variant</*your types of nodes here*/> type;
}

然后在你的节点上调用这个访问者

std::visit([](auto&& node) {
if constexpr(std::is_same_v<std::decay_t<decltype(node)>, /* your type here */>) {
// ...
}
else if constexpr(/* ... */) {
// ...
}
}, node0.type);

关于c++ - AST : get leaf value when leafs are of different types,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56207404/

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