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; }
이 접근 방식을 활용하면 다음과 같은 결과가 출력됩니다. producer:
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!