Namensräume
Varianten
Aktionen

std::type_info::name

Von cppreference.com
< cpp‎ | types‎ | type info
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
 
const char* name() const;
(noexcept seit C++11)

Gibt eine implementierungsdefinierte, nullterminierte Zeichenkette zurück, die den Namen des Typs enthält. Es gibt keine Garantien; insbesondere kann die zurückgegebene Zeichenkette für verschiedene Typen identisch sein und sich zwischen Aufrufen desselben Programms ändern.

Inhalt

[bearbeiten] Parameter

(keine)

[bearbeiten] Rückgabewert

Nullterminierte Zeichenkette, die den Namen des Typs enthält.

[bearbeiten] Hinweise

Die Lebensdauer des Arrays, auf das der zurückgegebene Zeiger zeigt, ist nicht spezifiziert. In der Praxis bleibt es jedoch so lange bestehen, wie die RTTI-Datenstruktur für den gegebenen Typ existiert, was die Lebensdauer der Anwendung hat, es sei denn, sie wird aus einer dynamischen Bibliothek geladen (die entladen werden kann).

Einige Implementierungen (wie MSVC, IBM, Oracle) erzeugen einen menschenlesbaren Typnamen. Andere, insbesondere gcc und clang, geben den mangled name zurück, der durch die Itanium C++ ABI spezifiziert ist. Der mangled name kann mit implementierungsspezifischen APIs wie abi::__cxa_demangle direkt oder über boost::core::demangle in eine menschenlesbare Form umgewandelt werden. Er kann auch durch das Kommandozeilen-Dienstprogramm c++filt -t geleitet werden.

[bearbeiten] Beispiel

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

Mögliche Ausgabe

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

[bearbeiten] Siehe auch

(C++11)
gibt einen Wert zurück, der für denselben Typ identisch ist
(public member function) [bearbeiten]