【发布时间】:2019-07-12 06:45:24
【问题描述】:
我需要在 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>();
这是更好的方法吗?我怎样才能重现这个?
【问题讨论】:
-
关于你的最后一段代码,你可以使用 std::any
-
不完全确定我是否遵循您的设计,但看起来visitor pattern 可能有用。
-
您的问题不清楚,类型转换有多种解决方案,静态和动态!请添加更多详细信息。