Heim >Backend-Entwicklung >C++ >Wie kann ich std::type_info::name entschlüsseln, um den zugrunde liegenden Typ in C anzuzeigen?
De-Mangler für std::type_info::name: Enthüllung des entmystifizierten Namens
Der von std::type_info entstellte Name bleibt rätselhaft Dies macht es schwierig, den zugrunde liegenden Typ zu verstehen. Die Suche nach einer Lösung, die dieses Rätsel entwirrt, hat zur Erforschung verschiedener Ansätze geführt.
Den entstellten Namen entwirren
Eine Lösung nutzt die leistungsstarken Funktionen und g ' von C 11 s libstdc-Bibliothek über die Funktion abi::__cxa_demangle. Diese Funktion dekodiert den entstellten Namen und gibt eine für Menschen lesbare Zeichenfolge zurück.
C 11-Implementierung
In der C 11-Implementierung ist die Demangle-Funktion im „Typ“ enthalten .hpp“-Headerdatei, und die eigentliche Entflechtungslogik befindet sich in „type.cpp“. Der folgende Codeausschnitt veranschaulicht:
#include "type.hpp" std::string demangle(const char* name) { int status = -4; std::unique_ptr<char, void(*)(void*)> res { abi::__cxa_demangle(name, NULL, NULL, &status), std::free }; return (status==0) ? res.get() : name ; }
C 98-kompatible Version
Für diejenigen, die C 11 nicht verwenden, bleibt eine Alternative verfügbar. Die C 98-kompatible Implementierung in „type.cpp“ verwendet eine andere Technik, um den Namen zu entschlüsseln:
#include "type.hpp" struct handle { char* p; handle(char* ptr) : p(ptr) { } ~handle() { std::free(p); } }; std::string demangle(const char* name) { int status = -4; handle result( abi::__cxa_demangle(name, NULL, NULL, &status) ); return (status==0) ? result.p : name ; }
Verwendung und Überlegungen
Der entschlüsselte Name kann abgerufen werden Verwenden der Typfunktion, die einen Verweis auf den zu entschlüsselnden Typ akzeptiert. Der folgende Code demonstriert seine Verwendung:
#include "type.hpp" struct Base { virtual ~Base() {} }; struct Derived : public Base { }; int main() { Base* ptr_base = new Derived(); std::cout << "Type of ptr_base: " << type(ptr_base) << std::endl; std::cout << "Type of pointee: " << type(*ptr_base) << std::endl; delete ptr_base; }
Fazit
Mit diesen Techniken können Entwickler jetzt die verborgenen Identitäten entstellter Typnamen aufdecken und so ein klareres Verständnis davon erlangen die an ihrem Code beteiligten Typen.
Das obige ist der detaillierte Inhalt vonWie kann ich std::type_info::name entschlüsseln, um den zugrunde liegenden Typ in C anzuzeigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!