【发布时间】:2019-11-09 13:51:24
【问题描述】:
例如,我有以下课程:
template<typename T>
class Foo {
public:
T getBar();
private:
T bar_;
};
实例化为:
Foo<Bar> foo;
我提取class Foo 的clang::CXXRecordDecl 节点,并遍历其字段:
for (const clang::FieldDecl *fieldDecl: fooRecordDecl->fields()) {
// fieldDecl->getType() gives T
// fieldDecl->getNameAsString() gives bar_
}
我想要一些可以提供fieldDecl->getInstantiatedType() 的东西,它可以提供Bar
我了解Foo 的CXXRecordDecl 的AST 不应包含有关实例化类型的任何信息。 我想知道此链接信息是否存储在 AST 中的其他位置,以及如何检索它。
我当前的解决方案涉及按顺序获取未初始化的模板参数,例如 {A, B, C} 用于 template<typename A, typename B, typename C> class Baz {}; 并将它们存储在 std::vector 中。然后找到实例化调用Baz<Foo, Bar, Baz>,将实例化的类型按顺序存储在另一个std::vector中,并通过索引链接在一起得到:
{ A: Foo, B: Bar, C: Baz}
这看起来很复杂,而且像“un-Clang”一样。
【问题讨论】:
标签: c++ c++11 clang abstract-syntax-tree libtooling