Namespaces
Variants

std::type_info:: name

From cppreference.net
Utilities library
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)
возвращает значение, которое идентично для одинаковых типов
(публичная функция-член)