std::type_info::name
const char* name() const;
|
(noexcept начиная с C++11) | |
Возвращает определяемую реализацией строку символов с нулевым завершителем, содержащую имя типа. Никаких гарантий не даётся; в частности, возвращаемая строка может быть одинаковой для нескольких типов и изменяться между вызовами одной и той же программы.
Параметры
(нет)
Возвращаемое значение
Нуль-терминированная символьная строка содержащая имя типа.
Примечания
Время жизни массива, на который указывает возвращаемый указатель, не определено, но на практике он сохраняется до тех пор, пока существует RTTI data structure для данного типа, которая существует в течение всего времени работы приложения, если только она не загружена из dynamic library (которая может быть выгружена).
Некоторые реализации (такие как 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)
|
возвращает значение, которое идентично для одинаковых типов
(публичная функция-член) |