Spec-Zone.ru › C++

std::type_info::name

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

См. также

hash_code
(C++11)
возвращает значение, которое идентично для одинаковых типов
(публичный член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/type_info/name

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API