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

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


我正在创建一个像这样的AST:

c++ - AST:当叶子为不同类型时,获取叶子值-LMLPHP

我需要从叶子检索数据。我的问题是叶子包含异构数据。叶子可以表示整数值,双精度型,字符串等。

我可以创建从IntValue继承并存储相应数据的类,例如DoubleValueValue,执行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:当叶子为不同类型时,获取叶子值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56207404/

10-11 22:53