5

我正在尝试使用模板模板参数libtooling打印CXXRecordDecl模板类的实例。不幸的是,模板模板参数的字符串表示不是完全限定的(例如,它缺少名称空间)。

我正在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;
}

如何使用模板模板参数打印类的完全限定名称?

在相关的说明中,有没有办法在不调用的情况下做到这一点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]在 Cling 问题跟踪器上针对上述问题发布了一个问题。请注意,查看该页面需要您使用 CERN 轻量级帐户登录。有关创建帐户的说明,请参阅此页面。

4

1 回答 1

3

试试这个:decl->getQualifiedNameAsString();

貌似目前clang/libclang有合适的部分,但是没有合适简单的只打印全名的解决方案,

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

但是有cling基于clang实现此类功能的项目,请参见此处:

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版本之后,所以希望最好。

于 2015-11-11T04:21:52.280 回答