我正在尝试使用libtooling打印带有模板template参数的模板类实体的CXXRecordDecl。不幸的是,模板template参数的字符串表示形式不完全合格(例如,缺少 namespace )。

我正在使用以下代码打印CXXRecordDecl:

clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);

这是一个示例,我希望输出是ns::A<ns::B>,但我得到ns::A<B>:

namespace ns {

template <template <class> class T>
class A {
  T<int> x;
};

template <class T>
class B {
  T y;
};

} // namespace ns

int main(int argc, char **argv)
{
  using namespace ns;
  A<B> z;
}

如何使用模板template参数打印类的全名?

在相关说明中,有没有一种方法可以不调用getCanonicalTypeInternal听起来像内部函数?

[编辑#1] 我也尝试过decl->getQualifiedNameAsString(),它完全省略了模板参数并输出ns::A

[编辑#2] Cling将一组问题换成另一组。它确实会为模板模板参数正确生成标准类型。但是,它会为参数的参数产生不合格的名称,并返回函数(和函数指针)的类型。例如,以下代码生成输出ns::A<void (B)>而不是ns::A<void (ns::B)>:

namespace ns {

class B { };

template <class T>
class A { };

} // namespace

int main(int argc, char **argv)
{
  using namespace ns;

  A<void (B)> x;
}

[编辑#3] 我针对上述问题发布了an issue on the Cling issue tracker。请注意,查看页面要求您使用CERN轻型帐户登录。有关创建帐户的说明,请参见this page

最佳答案



目前看来clang/libclang已适合
零件,但没有仅打印全名的合适且简单的解决方案,

看到这个http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html

但是有一个基于clingclang项目实现了这种功能,
看看这里:

https://root.cern.ch/gitweb?p=root.git;a=blob;f=interpreter/cling/include/cling/Utils/AST.h;h=91cea2ef82f6a6b2ed4671d43253b1c0ebd86fd4;hb=HEAD

std::string GetFullyQualifiedName(clang::QualType QT,
                                        const clang::ASTContext &Ctx);

正是您要查找的内容,在申请示例后返回ns::A<ns::B>
好像他们将此功能集成到下一个clang/libclang版本中或下一个版本之后,所以希望最好。

07-24 09:44
查看更多