You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 19:15:06