c++ - 是否有用于标准化类型名称字符串格式的 C++ type_info 的可移植包装器?

标签 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); // 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/

相关文章:

c++ - 如何比较 2 boost::icl::interval_set 的相等性

c++ - 如何减少从一个 boost 链到另一个 boost 链的延迟

javascript - 如何创建使用react-navigation泛型的新泛型对象类型?

oracle - 带有索引的 plsql 表类型正在提示

c++ - 令人困惑的运算符优先级 : a << b + c << d

C++如何将来自stdio的输入字符串放入 vector 中,每个容器元素一个字

c++ - 使用 Boost Karma 打印 boost::posix_time::time_duration

c++ - 动态分配类,有继承问题

c++ - QRegExp 不符合预期

types - 通用 Lisp : How to check if something is a type specifier?