type_info::name()
的输出格式是特定于实现的。
namespace N { struct A; }
const N::A *a;
typeid(a).name(); // returns e.g. "const struct N::A" but compiler-specific
有没有人编写过一个包装器,它返回可靠的、可预测的类型信息,这些信息在编译器中是相同的。多个模板化函数将允许用户获取有关类型的特定信息。所以我也许可以使用:
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"
这些函数只是示例,对 C++ 类型系统有更深入了解的人可能会设计出更好的 API。我对 base()
感兴趣的那个。如果 RTTI 被禁用或检测到不支持的编译器,所有函数都会引发异常。
这似乎是 Boost 可能实现的那种东西,但我在任何地方都找不到它。有没有这样的可移植库?
最佳答案
在 C++ 中执行此类操作存在一些限制,因此您可能无法在不久的将来准确找到您想要的内容。关于编译器在编译代码中插入的类型的元信息也是特定于编译器使用的 RTL 的实现,因此如果不依赖未记录的特性,第三方库很难做好在以后的版本中可能会中断的每个特定编译器。
据我所知,Qt 框架与您的意图最接近。但他们这样做完全独立于 RTTI。相反,他们有自己的“编译器”来解析源代码并使用元信息生成额外的源模块。然后,您将这些模块与您的程序一起编译+链接,并使用它们的 API 来获取信息。看看http://doc.qt.nokia.com/latest/metaobjects.html
关于c++ - 是否有用于标准化类型名称字符串格式的 C++ type_info 的可移植包装器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8475321/