是否有一个C++ type_info的可移植包装器,它标准化了类型名称字符串格式?

pap*_*jam 21 c++ boost types typeid typeinfo

输出的格式type_info::name()是特定于实现的.

namespace N { struct A; }

const N::A *a;

typeid(a).name(); // returns e.g. "const struct N::A" but compiler-specific
Run Code Online (Sandbox Code Playgroud)

是否有人编写了一个包装器,它返回可靠,可预测的类型信息,这些信息在编译器中是相同的.多个模板化函数将允许用户获取有关类型的特定信息.所以我可以使用:

MyTypeInfo::name(a); // returns "const struct N::A *"
MyTypeInfo::base(a); // returns "A"
MyTypeInfo::pointer(a); // returns "*"
MyTypeInfo::nameSpace(a); // returns "N"
MyTypeInfo::cv(a); // returns "const"
Run Code Online (Sandbox Code Playgroud)

这些函数只是示例,对C++类型系统有更好了解的人可能会设计出更好的API.我感兴趣的那个base().如果禁用RTTI或检测到不支持的编译器,则所有函数都会引发异常.

这似乎是Boost可能实现的那种东西,但我无法在任何地方找到它.是否有便携式库可以做到这一点?

Fab*_*llo 2

在 C++ 中执行此类操作存在一些限制,因此您可能在不久的将来找不到您想要的东西。有关编译器在已编译代码中插入的类型的元信息也是特定于编译器使用的 RTL 的实现的,因此第三方库在不依赖未记录的功能的情况下很难做好工作每个特定编译器可能会在以后的版本中崩溃。

据我所知,Qt 框架最接近您的预期。但他们的做法完全独立于 RTTI。相反,他们有自己的“编译器”,可以解析源代码并生成带有元信息的附加源模块。然后,您将这些模块与您的程序一起编译+链接,并使用它们的 API 来获取信息。看看http://doc.qt.nokia.com/latest/metaobjects.html