我正在尝试使用模板模板参数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轻型帐户登录。有关创建帐户的说明,请参见此页面。
试试这个:
decl->getQualifiedNameAsString();
看起来目前clang/libclang
有合适的部分,但没有合适的简单解决方案仅打印全名,
看到这个http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html
但有cling
一个基于clang
该功能的项目,请参见此处:
std::string GetFullyQualifiedName(clang::QualType QT,
const clang::ASTContext &Ctx);
正是您要寻找的东西,在申请您的示例后返回 ns::A<ns::B>
好像他们将此功能集成到下一个clang/libclang
版本或下一个版本中一样,所以希望最好。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句