C++ 是否有C+的便携包装器+;类型\标准化类型名称字符串格式的信息?

C++ 是否有C+的便携包装器+;类型\标准化类型名称字符串格式的信息?,c++,boost,types,typeid,typeinfo,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 是否有人编写了一个包装器,返回可靠、可预测的类型信息,这些信息在编译器中是相同的。多个模板函数将允许用户获取有关类型的特定信息。所以我可以使用: MyTypeInfo::name(a); // ret

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获取信息。看看Jeremy Pack(来自Boost Extension plugin framework)似乎写了这样一个东西:

三,。RTTI并不总是像预期的那样跨DLL边界运行。查看type_info类,看看我是如何处理的

所以你可以看看那里



另外,我记得,因为我曾经在那个区域修复过一个bug;这可能仍然会添加信息,因此这里有一个链接:

GCC有
\uuucxa\udemangle


如果您针对的所有编译器都有这样的扩展,您可以使用它们编写带有宏的可移植函数来检测编译器。

我看不出有什么问题。imho说,至少在某些编译器上有一些东西是有效的,总比没有好。我认为这在所有编译器上都是有效的,因为自检非常简单,运行时开销很低。我什么都不知道,但听起来这是个好主意。(从形式上讲,标准允许实现返回所有类型的
,但实际上,大多数实现都返回一些直接可用的内容,而那些没有返回可被请求的损坏名称的实现。)我所看到的唯一问题是字符串完全特定于实现,而且决不能保证忠实地表示类型本身。更糟糕的是,它甚至可能不是唯一的。@Matthieu-library检测到这样的编译器,调用失败。打电话的人必须接受它。我们大多数人使用的编译器在
type\u info
中提供了有用的信息。我不确定这是否符合我的要求-我对实际的类型名称字符串感兴趣,而不是比较类型。