std::vector<MyType> myVector(1);
这表示为Clang AST中的CXXConstructExpr.我有一个匹配器找到这个CXXConstructExpr,但我想从中提取MyType的decl.
我尝试了各种各样的东西,但似乎没有任何作用:
const CXXConstructExpr* construct = Result.Nodes.getNodeAs<CXXConstructExpr>("expr");construct->getConstructor()->getTemplateSpecializationArgs() // Always nullptrconstruct->getConstructor()->getParent() // Seems to lose the template parametersconstruct->getConstructor()->getDescribedTemplate() // Always nullptr解决方法 这是一个匹配器:
varDecl( has( cxxConstructExpr() ),hasType( classtemplateSpecializationDecl().bind(sp_dcl_bd_name_) )).bind(var_bd_name_);
它从VarDecl开始并遍历到类型,这是一个埋在向量的ClasstemplateDecl中的ClasstemplateSpecializationDecl.在回调中,可以从ClasstemplateSpecializationDecl工作到模板参数列表,并对各个模板参数进行 *** 作:
using CTSD = ClasstemplateSpecializationDecl;CTSD * spec_decl = const_cast<CTSD *>(result.Nodes.getNodeAs<CTSD>(sp_dcl_bd_name_));VarDecl * var_decl = const_cast<VarDecl *>(result.Nodes.getNodeAs<VarDecl>(var_bd_name_));if(spec_decl && var_decl) { // get the template args TemplateArgumentList const &tal(spec_decl->getTemplateArgs()); for(unsigned i = 0; i < tal.size(); ++i){ TemplateArgument const &ta(tal[i]); // is this arg a type arg? If so,get that type TemplateArgument::ArgKind k(ta.getKind()); std::string argname = ""; if(k==TemplateArgument::ArgKind::Type){ QualType t = ta.getAsType(); argname = t.getAsstring(); } // Could do similar actions for integral args,etc... std::cout << "For variable declared at " << corct::sourceRangeAsstring(var_decl->getSourceRange(),&sm) << ":" << spec_decl->getnameAsstring() << ": template arg " << (i+1) << ": " << argname << std::endl; } // for template args} // if
对于此代码:
struct B{int b_;};std::vector<B> vb(1);
这会产生:
For variable declared at <line:14:1,col:20>:vector: template arg 1: struct BFor variable declared at <col:1,col:20>:vector: template arg 2: class std::__1::allocator<struct B>
完整示例位于代码分析和重构与Clang工具示例repo在github:https://github.com/lanl/CoARCT(请参阅apps / TemplateType.cc)
总结以上是内存溢出为你收集整理的c – 从Clang AST中的CXXConstructExpr中检索模板参数全部内容,希望文章能够帮你解决c – 从Clang AST中的CXXConstructExpr中检索模板参数所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)