Я хочу обрабатывать аргументы шаблона по-разному, так что для кода:
template <class T> class A {
public:
A() {}
};
void faa(A<int>& param);
Я хотел бы знать, что param является специализацией шаблона и получить доступ к его параметрам.
Поэтому я написал ASTVisitor
с функцией
bool VisitFunctionDecl(FunctionDecl *f) {
std::cout<< "VisitFunctionDecl" <<std::endl;
const DependentTemplateSpecializationType* t1;
const TemplateSpecializationType* t2;
for(ParmVarDecl* p :f->params())
{
t1=p->getType()->getAs<DependentTemplateSpecializationType>();
t2=p->getType()->getAs<TemplateSpecializationType>();
if(t1!=nullptr||t2!=nullptr)
{
std::cout<< "template param found" <<std::endl;
}
}
return true;
}
Но эти броски оба nullptr
всегда — я никогда не получаю template param found
выход.
Что я делаю неправильно? Есть ли другой способ привести t к некоторому королю типа, позволяющему проверить параметры шаблона?
Тип A<int>&
является LValueReference
(можно проверить с помощью getTypeClassName()
). То, что вы, вероятно, пытаетесь получить, это тип, указанный ссылкой. Вы можете получить это с getNonReferenceType()
метод.
bool VisitFunctionDecl(FunctionDecl *f) {
llvm::errs() << "VisitFunctionDecl:" << f->getQualifiedNameAsString()
<< "\n";
for (ParmVarDecl* p : f->params()) {
llvm::errs() << p->getType().getAsString() << " -> "<< p->getType()->getTypeClassName() << "\n";
llvm::errs() << "isPointerType: "<< p->getType()->hasPointerRepresentation() << "\n"<< "isTemplateSpecialization: "<< (nullptr != p->getType().getNonReferenceType()->getAs<
TemplateSpecializationType>()) << "\n";
}
return true;
}
вывод:
VisitFunctionDecl:faa
const A<int> & -> LValueReference
isPointerType: 1
isTemplateSpecialization: 1