我正在使用 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
)?
最佳答案
如果您还有该类型的 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/