std::type_info::name
const char* name() const; |
(до C++11) | |
const char* name() const noexcept; |
(с C++11) |
Возвращает определяемую реализацией строку с нулевым завершением, содержащую имя типа. Гарантий не дается; в частности, возвращаемая строка может быть идентичной для нескольких типов и изменяться при вызовах той же программы.
Параметры
(нет)
Возвращаемое значение
строка с нулевым завершением, содержащая имя типа.
Примечания
Срок жизни массива, на который указывает возвращаемый указатель, не определен, но на практике он сохраняется до тех пор, пока существует структура данных RTTI для данного типа, которая имеет жизненный цикл приложения, если только не загружается из динамической библиотеки (которую можно выгрузить).
Некоторые реализации (например, MSVC, IBM, Oracle) генерируют удобочитаемое имя типа. Другие, в частности, gcc и clang, возвращают искажённое имя, которое задаётся Itanium C++ ABI. Искажённое имя можно преобразовать в удобочитаемую форму, используя специфичные для реализации API, такие как abi::__cxa_demangle напрямую или через boost::core::demangle. Его также можно передать в утилиту командной строки c++filt -t.
Пример
#include <iostream>
#include <cstdlib>
#include <string>
#include <typeinfo>
#include <boost/core/demangle.hpp>
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/w/cpp/types/type_info/name