Namespaces
Variants

std::type_info::name

Заголовок ru.cppreference.net
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
 
 
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)
возвращает значение, которое идентично для одинаковых типов
(публичная функция-член)