Mic*_*val 5 c++ clang template-templates libtooling
我正在尝试使用模板模板参数libtooling来打印CXXRecordDecl模板类的实例化。不幸的是,模板模板参数的字符串表示不是完全限定的(例如,它缺少命名空间)。
我正在CXXRecordDecl使用以下代码打印:
clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);
Run Code Online (Sandbox Code Playgroud)
这是一个示例,我希望输出为ns::A<ns::B>,但我得到ns::A<B>:
clang::PrintingPolicy policy = compiler_instance->getLangOpts();
std::string name = decl->getTypeForDecl()->getCanonicalTypeInternal().getAsString(policy);
Run Code Online (Sandbox Code Playgroud)
如何使用模板模板参数打印类的完全限定名称?
在相关说明中,有没有办法在不调用 的情况下做到这一点getCanonicalTypeInternal,这听起来像是一个内部函数?
[编辑 #1]我也试过decl->getQualifiedNameAsString(),它完全省略了模板参数和输出ns::A。
[编辑#2] Cling 用一组问题交换另一组问题。它确实为模板模板参数正确生成了完全限定的类型。但是,它会为函数(和函数指针)的参数和返回类型生成非限定名称。例如,下面的代码产生输出ns::A<void (B)>而不是ns::A<void (ns::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;
}
Run Code Online (Sandbox Code Playgroud)
[编辑 #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);
Run Code Online (Sandbox Code Playgroud)
正是您所寻找的,在申请您的示例后它会返回ns::A<ns::B>
看起来他们将此功能集成到下一个或下一个clang/libclang版本之后,所以希望一切顺利。
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |