【问题标题】:How do I get the name of a TemplateTypeParmType in Clang?如何在 Clang 中获取 TemplateTypeParmType 的名称?
【发布时间】:2016-05-23 09:44:05
【问题描述】:

我正在使用 Clang 打印一些关于我的 AST 的信息。

例如:

template<typename T>
class Slices : public Fruit {
  T fruit;
  int numberOfSlices;
  public: 
    Slices(T fruit, int numberOfSlices)
      : fruit(fruit), numberOfSlices(numberOfSlices) {
    }
    std::string getName() {
      return "Sliced " + fruit.getName();
    }
    int getNumberOfSlices() {
      return numberOfSlices;
    }
};

应该打印类似:

template<typename T>
Slices
  Fields: 
    T fruit;
    int numberOfSlices
  Methods: 
...

我写了一个访问者,它在T fruit 中的T 处点击TemplateTypeParmType 节点。

但是,该节点似乎没有附加任何标识符。这些都是null

x->getDecl()
x->getIdentifier()

如何从该节点提取模板名称(此处为 T)?

【问题讨论】:

    标签: templates clang abstract-syntax-tree


    【解决方案1】:

    如果您还拥有该类型的 QualType(您可以从每个字段的 FieldDecl 中获取它,等等),您只需调用 getAsString() 即可。如果没有,您可以创建一个没有限定符的,即

    auto name = clang::QualType(type, 0).getAsString();
    

    当然,限定符信息(例如const)将会丢失。确保您拥有的类型不是规范类型 (http://clang.llvm.org/docs/InternalsManual.html#canonical-types),否则您只会得到类似 type-parameter-0-0 的名称。

    我还没有找到获取 decl 或标识符的方法,但如果您愿意使用调试器逐步检查 clang 代码,您可能会找到 getAsString 方法从哪里获取此信息。

    【讨论】:

      猜你喜欢
      • 2017-04-06
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多