例如,我有以下课程:
template<typename T>
class Foo {
public:
T getBar();
private:
T bar_;
};
它被实例化为:
Foo<Bar> foo;
我提取 的clang::CXXRecordDecl
节点class Foo
,并遍历其字段:
for (const clang::FieldDecl *fieldDecl: fooRecordDecl->fields()) {
// fieldDecl->getType() gives T
// fieldDecl->getNameAsString() gives bar_
}
我想要一些能fieldDecl->getInstantiatedType()
提供的东西Bar
我了解CXXRecordDecl
of的 ASTFoo
不应包含有关实例化类型的任何信息。我想知道这个链接信息是否存储在 AST 的其他地方,以及如何检索它。
我当前的解决方案涉及按顺序获取未初始化的模板参数,例如{A, B, C}
fortemplate<typename A, typename B, typename C> class Baz {};
并将它们存储在std::vector
. 然后找到实例化调用Baz<Foo, Bar, Baz>
,将实例化的类型按顺序存储在另一个中std::vector
,并通过索引将它们链接在一起,得到:
{ A: Foo, B: Bar, C: Baz}
这看起来很复杂,而且像“un-Clang”一样。