Namespaces
Variants

std::type_info:: name

From cppreference.net
Utilities library
const char * name ( ) const ;
(noexcept depuis C++11)

Retourne une chaîne de caractères terminée par un caractère nul, définie par l'implémentation, contenant le nom du type. Aucune garantie n'est donnée ; en particulier, la chaîne retournée peut être identique pour plusieurs types et changer entre différentes invocations du même programme.

Table des matières

Paramètres

(aucun)

Valeur de retour

Chaîne de caractères terminée par un caractère nul contenant le nom du type.

Notes

La durée de vie du tableau pointé par le pointeur retourné n'est pas spécifiée, mais en pratique il persiste tant que la structure de données RTTI pour le type donné existe, qui a la durée de vie de l'application à moins d'être chargée depuis une bibliothèque dynamique (qui peut être déchargée).

Certaines implémentations (comme MSVC, IBM, Oracle) produisent un nom de type lisible par l'humain. D'autres, notamment gcc et clang, retournent le nom manglé, qui est spécifié par l' Itanium C++ ABI . Le nom manglé peut être converti en forme lisible par l'humain en utilisant des API spécifiques à l'implémentation telles que abi::__cxa_demangle directement ou via boost::core::demangle . Il peut également être traité via l'utilitaire en ligne de commande c ++ filt - t .

Exemple

#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());
}

Sortie possible :

// GCC/Clang:
4Base
7Derived
PK4Base => Base const*
c++filt => Base const*
// MSVC:
struct Base
struct Derived
struct Base const * __ptr64 => struct Base const * __ptr64

Voir aussi

(C++11)
retourne une valeur identique pour les mêmes types
(fonction membre publique)