C の領域では、 std::type_info は、クラスによって例示されるエンティティの型についての重要な洞察を提供します。インスタンスまたは関数。ただし、この型名の表現が混乱しているため、その本当の正体がわかりにくくなることがよくあります。たとえば、typeid(std::vector
飼いならすにはこのバラバラになった獣に対して、私たちは恐るべき分解能力を活用したソリューションを提案します。 std::demangle の、基になる型の人が読める形式を明らかにするための強力なツールです。このソリューションを使用するためのステップバイステップのガイドは次のとおりです:
#include <string> #include <typeinfo> std::string demangle(const char* name); template <class T> std::string type(const T& t) { return demangle(typeid(t).name()); }
type.cpp (C 11): C 11 の機能を利用して効率的なデマングリング操作を行う:
#ifdef __GNUG__ #include <cstdlib> #include <memory> #include <cxxabi.h> 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 ; } #else std::string demangle(const char* name) { return name; } #endif
type.cpp (C 98): システムに代替ソリューションを提供するC11なし機能:
#ifdef __GNUG__ #include <cstdlib> #include <memory> #include <cxxabi.h> struct handle { char* p; handle(char* ptr) : p(ptr) { } ~handle() { std::free(p); } }; std::string demangle(const char* name) { int status = -4; // some arbitrary value to eliminate the compiler warning handle result( abi::__cxa_demangle(name, NULL, NULL, &status) ); return (status==0) ? result.p : name ; } #else // does nothing if not g++ std::string demangle(const char* name) { return name; } #endif
使用法: ソリューションをコードに統合して、人間が読める型名を簡単に抽出します:
#include <iostream> #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; }
このアプローチを利用すると、次の出力は次のようになります。 generated:
Type of ptr_base: Base* Type of pointee: Derived
互換性と注意点:
提供されたソリューションは、 g 、clang 、Mingw32 などのさまざまなプラットフォームとコンパイラーでテストされています。主に g をターゲットとしていますが、C 98 バージョンは非 g システムでも使用できます。ベンダー固有の API はそれに応じて異なる場合があることに注意することが重要です。
結論として、このデマングリング ソリューションを使用すると、人間が判読できる型名を std::type_info から簡単に抽出できるようになり、マングルされた表現に伴う不明瞭さが排除されます。提供されたコード スニペットを活用することで、この機能をプロジェクトにシームレスに統合し、デバッグ機能とロギング機能を明確かつ簡単に強化できます。
以上が`std::type_info` からマングルされた C 型名をデマングルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。