Например, у меня есть следующий класс:
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
Я понимаю, что AST для CXXRecordDecl
из Foo
не должен содержать никакой информации об экземпляре типа. Мне было интересно, была ли эта информация о связях храниться где-то еще в 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}
Это кажется очень запутанным и "не-лязгом".