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可能实现的那种东西,但我无法在任何地方找到它。有没有可移植的库?
答案 0 :(得分:2)
在C ++中执行此类操作有一些限制,因此您可能无法在不久的将来找到您想要的内容。有关编译器在编译代码中插入的类型的元信息也是编译器使用的RTL特定于实现的,因此第三方库很难在不依赖于未记录的功能的情况下做得很好在以后的版本中可能会破坏的每个特定编译器。
据我所知,Qt框架与您的意图最接近。但他们完全独立于RTTI。相反,他们有自己的“编译器”来解析源代码并使用元信息生成其他源模块。然后,您将这些模块与您的程序一起编译+链接,并使用它们的API来获取信息。看看http://doc.qt.nokia.com/latest/metaobjects.html
答案 1 :(得分:1)
Jeremy Pack(来自Boost Extension插件框架)似乎写了这样的东西:
http://blog.redshoelace.com/2009/06/resource-management-across-dll.html
3. RTTI并不总是在DLL边界上按预期运行。查看type_info类,看看我是如何处理它的。
所以你可以看看那里。
PS。我记得因为我曾经修过那个区域的一个小虫;这可能仍会添加信息,所以这里是链接:https://stackoverflow.com/a/5838527/85371
答案 2 :(得分:0)
GCC有__cxa_demangle
https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
如果您定位的所有编译器都有这样的扩展,您可以使用它们编写带宏的可移植函数来检测编译器。