我正在尝试使用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] 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。
答案 0 :(得分:3)
试试这个:
decl->getQualifiedNameAsString();
看起来当前时刻clang/libclang
合适
零件,但没有合适而简单的解决方案,只需打印全名,
请参阅此http://lists.llvm.org/pipermail/cfe-dev/2015-October/045473.html
但基于cling
的{{1}}项目实现了此类功能,
看看这里:
clang
正是您所寻找的,在申请您的示例后,它会返回std::string GetFullyQualifiedName(clang::QualType QT,
const clang::ASTContext &Ctx);
看起来他们将此功能集成到下一个版本或下一个ns::A<ns::B>
版本之后,所以希望最好。