templates - 如何在 Clang 中获取 TemplateTypeParmType 的名称?

标签 templates clang abstract-syntax-tree

我正在使用 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 FruitT 处的 TemplateTypeParmType 节点。

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

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

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

最佳答案

如果您还有该类型的 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 方法获取的位置此信息来自。

关于templates - 如何在 Clang 中获取 TemplateTypeParmType 的名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37387654/

相关文章:

c++方法通过模板绑定(bind)

C++11 简化了调用同一模板函数的不同特化的模板函数的语法

c++ - 处理 2+ 模板参数的最佳方法?

c++ - clang++ 是否以更宽松的方式对待系统头?

c - Yacc-如何编写使用 C 结构节点进行赋值操作的操作代码

C++ 模板未在 header /链接器错误中定义

c++ - <experimental/any> 上的 clang++ 错误

ios - 如何将 UIKit 类或方法标记为已弃用?

c - 使用 GraphViz 了解 -fdump-tree 输出 gcc

c# - C# 中的 System.Linq.Expressions 是干什么用的?