std::type_info::name
来自 cppreference.com
const char* name() const; |
(自 C++11 起 noexcept) | |
返回一个实现定义的以空字符结尾的字符字符串,其中包含类型的名称。不提供任何保证;特别是,返回的字符串对于几种类型可能是相同的,并且在同一程序的多次调用之间可能会发生变化。
内容 |
[编辑] 参数
(无)
[编辑] 返回值
以空字符结尾的字符字符串,其中包含类型的名称。
[编辑] 注释
返回的指针指向的数组的生存期未指定,但实际上它只要给定类型的 RTTI 数据结构存在,它就一直持续存在,除非从可以卸载的动态库中加载,该数据结构具有应用程序生存期。
一些实现(例如 MSVC、IBM、Oracle)会生成人类可读的类型名称。其他实现,最著名的是 gcc 和 clang,会返回经过修饰的名称,该名称由 Itanium C++ ABI 指定。经过修饰的名称可以使用特定于实现的 API 转换为人类可读的形式,例如 abi::__cxa_demangle
直接或通过 boost::core::demangle
。它还可以通过命令行实用程序 c++filt -t 传递。
[编辑] 示例
运行此代码
#include <boost/core/demangle.hpp> #include <cstdlib> #include <iostream> #include <string> #include <typeinfo> struct Base { virtual ~Base() = default; }; struct Derived : Base {}; int main() { Base b1; Derived d1; const Base* pb = &b1; std::cout << typeid(*pb).name() << '\n'; pb = &d1; std::cout << typeid(*pb).name() << '\n'; std::string real_name = boost::core::demangle(typeid(pb).name()); std::cout << typeid(pb).name() << " => " << real_name << '\n'; std::cout << "c++filt => " << std::flush; std::string s = typeid(pb).name(); std::system(("c++filt -t " + s).data()); }
可能的输出
// GCC/Clang: 4Base 7Derived PK4Base => Base const* c++filt => Base const* // MSVC: struct Base struct Derived struct Base const * __ptr64 => struct Base const * __ptr64
[编辑] 另请参阅
(C++11) |
返回对于相同类型相同的数值 (公有成员函数) |