Например, у меня есть класс:
template<typename T>
class Foo {
public:
T getBar();
private:
T bar_;
};
Он создается с помощью:
using FooBarT = Foo<Bar>;
Как получить CXXRecordDecl
с разрешенными полями и методами для Foo<bar>
?
Я пытался:
const auto *typeAliasDecl = llvm::dyn_cast<clang::TypeAliasDecl>(decl);
typeAliasDecl->getUnderlyingType()->getAsCXXRecordDecl()->dump();
Вывод, который я получаю:
ClassTemplateSpecializationDecl 0x0000000 class Foo
`-TemplateArgument type 'Bar'
Однако я хочу CXXRecordDecl
с полями иметоды тоже, поэтому я могу перебирать их.Я также пытался:
for (const auto *contextDecl: typeAliasDecl->getUnderlyingType()->getUnqualifiedDesugaredType()->getAsCXXRecordDecl()->getDeclContext()->decls()) {
const auto *classTemplateDecl = llvm::dyn_cast<clang::ClassTemplateDecl>(contextDecl);
classTemplateDecl->dump();
}
Вывод:
ClassTemplateDecl Foo
|-TemplateTypeParmDecl 0x0000000 referenced typename depth 0 index 0 T
|-CXXRecordDecl class Foo definition
| ...
| |-FieldDecl 0x0000000 referenced bar_ 'T'
|-ClassTemplateSpecializationDecl 0x0000000 class Foo
`-TemplateArgument type 'Bar'
Как вы можете видеть, CXXRecordDecl class Foo definition
имеет доступ к FieldDecl
, но не знает овведите экземпляр bar_
, в то время как ClassTemplateSpecializationDecl
делает.
Я хочу CXXRecordDecl
с экземпляром типа для FieldDecl bar_