std::type_info:: name
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Basic types | |||||||||||||||||||||
| Fixed width integer types (C++11) | |||||||||||||||||||||
| Fixed width floating-point types (C++23) | |||||||||||||||||||||
|
|||||||||||||||||||||
| Numeric limits | |||||||||||||||||||||
| C numeric limits interface | |||||||||||||||||||||
| Runtime type information | |||||||||||||||||||||
|
|||||||||||||||||||||
| Member functions | ||||
|
(until C++20)
|
||||
|
(C++11)
|
||||
|
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)
|
возвращает значение, которое идентично для одинаковых типов
(публичная функция-член) |