std::type_info::name の解読: 謎を解いた名前を明らかにする
std::type_info によって解読された名前は謎のままですそのため、基になる型を理解することが困難になります。この謎を解明する解決策の探求は、さまざまなアプローチの探求につながりました。
マングルされた名前の解読
1 つのソリューションは、C 11 の強力な機能と g ' を活用します。 ■ abi::__cxa_demangle 関数による libstdc ライブラリ。この関数は、マングルされた名前をデコードし、人間が判読できる文字列を返します。
C 11 実装
C 11 実装では、マングル解除関数は「type」に含まれています。 .hpp」ヘッダー ファイルであり、実際のデマングリング ロジックは「type.cpp」にあります。次のコード スニペットは次のことを示しています。
#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 互換バージョン
C 11 を利用していない場合は、代替バージョンが引き続き利用可能です。 「type.cpp」の C 98 互換実装では、別の手法を使用して名前をデマングルします。
#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 ; }
使用法と考慮事項
デマングルされた名前は取得できます。 type 関数を使用します。この関数は、デマングルされる型への参照を受け取ります。次のコードは、その使用法を示しています。
#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; }
結論
これらの手法を使用すると、開発者は、マングルされた型名の隠された正体を明らかにし、型名の明確な理解を得ることができます。コードに含まれる型。
以上がC で std::type_info::name をデマングルして基になる型を明らかにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。