Пространства имён
Варианты
Действия

std::type_info::name

Материал из cppreference.com
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм (C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования (C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
 
 
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
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)
возвращает значение, идентичное для одинаковых типов
(public функция-элемент) [править]