我需要在AST中表示这样的结构:
struct {
int data;
double doubleDataArray[10];
struct {
int nestedData;
};
};
我正在创建一个像这样的AST:
我需要从叶子检索数据。我的问题是叶子包含异构数据。叶子可以表示整数值,双精度型,字符串等。
我可以创建从
IntValue
继承并存储相应数据的类,例如DoubleValue
,Value
,执行dynamic_cast
将Value
转换为其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:当叶子为不同类型时,获取叶子值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56207404/