CLang LibTooling 处理函数模板参数
CLang LibTooling handling function Template arguments
我想以不同的方式处理模板参数,因此对于代码:
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()
). What you are probably trying to get is type pointed by reference. You can get it with 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
我想以不同的方式处理模板参数,因此对于代码:
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()
). What you are probably trying to get is type pointed by reference. You can get it with 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