使用 libtool 获取完全限定的模板模板参数名称
Get fully qualified template template argument name using libtooling
我正在尝试使用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] 坚持将一组问题换成另一组问题。它确实为模板模板参数正确生成完全限定的类型。但是,它为函数(和函数指针(的参数和返回类型生成非限定名称。例如,下面的代码生成输出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 轻量级帐户登录。有关创建帐户的说明,请参阅此页面。
试试这个:
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
发布之后,所以希望最好。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 如何从"decltype()"获取函数参数的数量<funtion>?
- 有没有办法在从编译器获取参数时避免预处理器宏?
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 如何从参数中获取函数签名?
- 获取可变参数模板参数包的相关类型
- 在 C++11 中获取函子作为参数
- 如何使用可变参数模板获取参数的变量号及其大小C++
- 是否可以获取成员函数模板参数的拥有对象?
- 如何从 x64 程序集中的堆栈中获取参数?
- 获取第一个模板参数的可靠方法
- 如何从参数包获取指向对象的指针
- C++ 如何使派生类自动获取基类参数
- 通过命令行参数获取llvm ir文件时面临问题
- 在C++中,是否允许将函数指针强制转换为将指向基类或派生类的指针作为参数获取的函数指针
- 使用一个可选参数获取两个参数到main
- cpp 映射作为函数参数获取警告信息 "discards qualifiers"
- 从控制台应用中的命令行参数获取文件名C++
- 从模板参数获取函数参数
- 使用参数获取其他参数