使用 libtooling 获取完全限定的模板模板参数名称
Get fully qualified template template argument name using libtooling
我正在尝试使用 libtooling
打印带有模板模板参数的模板 class 的实例化 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;
}
如何使用模板模板参数打印 class 的完全限定名称?
在相关说明中,有没有一种方法可以在不调用 getCanonicalTypeInternal
的情况下执行此操作,这听起来像是一个内部函数?
[编辑 #1] 我也试过 decl->getQualifiedNameAsString()
,它完全省略了模板参数并输出 ns::A
.
[编辑 #2] Cling 将一组问题换成另一组问题。它确实为模板模板参数正确生成完全限定类型。但是,它会为参数和 return 类型的函数(和函数指针)生成非限定名称。例如,下面的代码生成输出 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 for the above issue. Note that viewing the page requires that you sign in with a CERN lightweight account. See this page 以获取创建帐户的说明。
Try this: decl->getQualifiedNameAsString();
目前看来clang/libclang
有合适的
部分,但没有只打印全名的合适且简单的解决方案,
看到这个http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html
但是有一个基于 clang
的 cling
项目实现了这样的功能,
看这里:
std::string GetFullyQualifiedName(clang::QualType QT,
const clang::ASTContext &Ctx);
正是您要找的,在申请了您的示例后 return ns::A<ns::B>
看起来他们将此功能集成到下一个或下一个 clang/libclang
版本之后,所以希望最好。
我正在尝试使用 libtooling
打印带有模板模板参数的模板 class 的实例化 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;
}
如何使用模板模板参数打印 class 的完全限定名称?
在相关说明中,有没有一种方法可以在不调用 getCanonicalTypeInternal
的情况下执行此操作,这听起来像是一个内部函数?
[编辑 #1] 我也试过 decl->getQualifiedNameAsString()
,它完全省略了模板参数并输出 ns::A
.
[编辑 #2] Cling 将一组问题换成另一组问题。它确实为模板模板参数正确生成完全限定类型。但是,它会为参数和 return 类型的函数(和函数指针)生成非限定名称。例如,下面的代码生成输出 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 for the above issue. Note that viewing the page requires that you sign in with a CERN lightweight account. See this page 以获取创建帐户的说明。
Try this:
decl->getQualifiedNameAsString();
目前看来clang/libclang
有合适的
部分,但没有只打印全名的合适且简单的解决方案,
看到这个http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html
但是有一个基于 clang
的 cling
项目实现了这样的功能,
看这里:
std::string GetFullyQualifiedName(clang::QualType QT,
const clang::ASTContext &Ctx);
正是您要找的,在申请了您的示例后 return ns::A<ns::B>
看起来他们将此功能集成到下一个或下一个 clang/libclang
版本之后,所以希望最好。