使用libtooling获得标准模板模板参数名称

迈克尔·科瓦尔

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

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

[Edit#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轻型帐户登录。有关创建帐户的说明,请参见此页面

gh

试试这个: 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版本或下一个版本中一样,所以希望最好。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

模板参数名称隐藏

来自分类Dev

doxygen:参数/模板参数名称的垂直对齐

来自分类Dev

错误:部署参数正在使用区分大小写的名称。错误参数名称:名称。(ARM模板部署)

来自分类Dev

XSL-如何从模板调用全局参数名称?

来自分类Dev

读取XSLT中特定模板的参数名称

来自分类Dev

使用不带参数的模板名称

来自分类Dev

当typedef名称与可变参数模板参数名称重合时发生GCC错误

来自分类Dev

使用模板参数的模板模板参数

来自分类Dev

参数名模板的参数化模板c ++ 11

来自分类Dev

更改类型参数名称时,模板替换失败-编译器错误?

来自分类Dev

可变参数模板函数名称查找无法找到专长

来自分类Dev

可变参数模板函数名称查找无法找到专业化

来自分类Dev

模板参数 SFINAE 不使用模板参数

来自分类Dev

C#Serilog:如何使用字符串插值记录日志并将参数名称保留在消息模板中?

来自分类Dev

使用名称空间作为参数的模板函数?

来自分类Dev

ARM 模板:如何引用使用参数设置名称的资源

来自分类Dev

Hibernate Envers获得标准修订

来自分类Dev

如何获得标准装配体的位置?

来自分类Dev

在C中使用标准函数名称

来自分类Dev

在C中使用标准函数名称

来自分类Dev

使用当前模板作为模板参数之一的模板参数

来自分类Dev

您在尝试使用 Symfony 模板组件加载模板时请求了不存在的参数“名称”错误

来自分类Dev

Mixin的名称与模板参数的参数化

来自分类Dev

使用模板类作为模板参数

来自分类Dev

正确使用C ++模板模板参数

来自分类Dev

使用模板模板参数进行前偏

来自分类Dev

使用类模板需要模板参数

来自分类Dev

使用模板参数实例化模板类

来自分类Dev

模板类,不使用模板参数

Related 相关文章

  1. 1

    模板参数名称隐藏

  2. 2

    doxygen:参数/模板参数名称的垂直对齐

  3. 3

    错误:部署参数正在使用区分大小写的名称。错误参数名称:名称。(ARM模板部署)

  4. 4

    XSL-如何从模板调用全局参数名称?

  5. 5

    读取XSLT中特定模板的参数名称

  6. 6

    使用不带参数的模板名称

  7. 7

    当typedef名称与可变参数模板参数名称重合时发生GCC错误

  8. 8

    使用模板参数的模板模板参数

  9. 9

    参数名模板的参数化模板c ++ 11

  10. 10

    更改类型参数名称时,模板替换失败-编译器错误?

  11. 11

    可变参数模板函数名称查找无法找到专长

  12. 12

    可变参数模板函数名称查找无法找到专业化

  13. 13

    模板参数 SFINAE 不使用模板参数

  14. 14

    C#Serilog:如何使用字符串插值记录日志并将参数名称保留在消息模板中?

  15. 15

    使用名称空间作为参数的模板函数?

  16. 16

    ARM 模板:如何引用使用参数设置名称的资源

  17. 17

    Hibernate Envers获得标准修订

  18. 18

    如何获得标准装配体的位置?

  19. 19

    在C中使用标准函数名称

  20. 20

    在C中使用标准函数名称

  21. 21

    使用当前模板作为模板参数之一的模板参数

  22. 22

    您在尝试使用 Symfony 模板组件加载模板时请求了不存在的参数“名称”错误

  23. 23

    Mixin的名称与模板参数的参数化

  24. 24

    使用模板类作为模板参数

  25. 25

    正确使用C ++模板模板参数

  26. 26

    使用模板模板参数进行前偏

  27. 27

    使用类模板需要模板参数

  28. 28

    使用模板参数实例化模板类

  29. 29

    模板类,不使用模板参数

热门标签

归档