std::type_info::name
const char* name() const; | (noexcept с C++11) |
Возвращает определяемую реализацией строку символов с завершающим нулевым символом, содержащую имя типа. Никаких гарантий не даётся; в частности, возвращаемая строка может быть одинаковой для нескольких типов и изменяться между вызовами одной и той же программы.
Параметры
(нет)
Возвращаемое значение
Строка символов с завершающим нулевым символом, содержащая имя типа.
Примечания
Время жизни массива, на который указывает возвращаемый указатель, не определено, но на практике он сохраняется, пока существует структура данных RTTI для данного типа. Она существует в течение всего времени работы приложения, если не загружена из динамической библиотеки (которую можно выгрузить).
Некоторые реализации (например, MSVC, IBM, Oracle) возвращают удобочитаемое имя типа. Другие, в частности gcc и clang, возвращают искажённое имя, формат которого определён в ABI Itanium C++. Искажённое имя можно преобразовать в удобочитаемый формат с помощью 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) | возвращает значение, одинаковое для одинаковых типов (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/type_info/name