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可能实现的东西,但我在任何地方都找不到它。有可移植的图书馆吗?
发布于 2011-12-12 14:46:01
在C++中这样做是有一些限制的,所以在不久的将来你可能找不到你想要的东西。有关编译器在编译代码中插入的类型的元信息也是特定于编译器使用的RTL的实现信息,因此第三方库很难在不依赖于每个特定编译器的无文档特性的情况下做好工作,这些特性可能会在以后的版本中出现。
据我所知,Qt框架最接近您的意图。但他们完全独立于RTTI。相反,他们有自己的“编译器”来解析源代码,并使用元信息生成额外的源代码模块。然后,您将这些模块与您的程序一起compile+link,并使用它们的API来获取信息。看看http://doc.qt.nokia.com/latest/metaobjects.html
发布于 2011-12-18 21:47:05
Jeremy (来自Boost Extension框架)似乎写过这样的东西:
http://blog.redshoelace.com/2009/06/resource-management-across-dll.html
RTTI并不总是像预期的那样跨
边界工作。查看一下type_info类,看看我是如何处理它的。
这样你就可以看看那里了。
PS。我记得是因为我曾经修复过该区域的一个bug;这可能仍然会添加信息,下面是链接:https://stackoverflow.com/a/5838527/85371
发布于 2015-06-18 15:08:16
GCC有__cxa_demangle https://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
如果您所针对的所有编译器都有这样的扩展,则可以使用它们编写带有宏的可移植函数,以检测编译器。
https://stackoverflow.com/questions/8475321
复制相似问题