如何不使用std::string操作从clang::ParmVarDecl获取无injected-class-name的类型名
解决方案
之所以调用getAsString()得到带struct前缀的结果,是因为clang默认的类型打印策略会输出ElaboratedType的类型标签(struct/union/class/enum 标识),你可以通过调整打印策略的参数直接得到目标结果,不需要自己做任何字符串裁剪操作:
- 第一步:获取当前AST上下文的打印策略,调整
SuppressElaboratedTypeKeyword配置项为true,该配置的作用就是省略elaborated类型的前缀标签 - 第二步:调用类型的带打印策略参数的
getAsString重载方法,传入调整后的策略即可
示例代码如下:
// parm 为你拿到的 clang::ParmVarDecl 指针,ctx 为当前编译的 ASTContext 引用 clang::PrintingPolicy customPolicy = ctx.getPrintingPolicy(); customPolicy.SuppressElaboratedTypeKeyword = true; std::string targetTypeName = parm->getOriginalType().getAsString(customPolicy);
执行上述代码后,你拿到的targetTypeName就是你期望的const A&结果。
如果有其他打印调整需求,可以修改PrintingPolicy的其他配置项:
SuppressInlineNamespaces: 省略内联命名空间前缀SuppressScope: 省略所有命名空间、父类作用域前缀SuppressTagKeyword: 和SuppressElaboratedTypeKeyword效果接近,适合直接处理TagDecl对应的类型
内容的提问来源于stack exchange,提问作者Gehry
相关产品推荐
相关产品推荐

