gpt4 book ai didi

c++ - 使用 libtooling 获取完全限定的模板模板参数名称

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:11 25 4
gpt4 key购买 nike

我正在尝试使用 libtooling打印 CXXRecordDecl具有模板模板参数的模板类的实例化。不幸的是,模板模板参数的字符串表示不完全限定(例如,它缺少 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;
}

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

在相关说明中,有没有一种方法可以在不调用 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有关创建帐户的说明。

最佳答案

Try this: 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>

看起来他们将此功能集成到 next 或 next 之后 clang/libclang发布,希望一切顺利。

关于c++ - 使用 libtooling 获取完全限定的模板模板参数名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33643923/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com