2009-04-25 2 views
17
class foo 
{ 
public: 
    void say_type_name() 
    { 
    std::cout << typeid(this).name() << std::endl; 
    } 
}; 

int main() 
{ 
    foo f;; 
    f.say_type_name(); 
} 

++ g에 추가 문자를 반환합니다. 이 P3foo 대신 foo는의 인쇄 왜 내가지고 있지 않다. 내가유형 ID는() 코드를 인쇄 g ​​내 우분투 시스템에 <em>P3foo</em> ++보다도

std::cout << typeid(*this).name() << std::endl; 

같은 코드를 변경하는 경우는 3foo를 인쇄합니다.

의견이 있으십니까?

답변

31

foo를 가리키는 포인터이기 때문입니다. 그리고 foo는 3자를 가지고 있습니다. 그래서 그것은 P3foo이됩니다. 다른 하나는 foo 유형이므로 3foo이됩니다. 이 텍스트는 구현에 따라 다르며,이 경우 GCC는 내부의 잘못된 이름을 제공합니다.

는 unmangled 이름을 얻을 수있는 프로그램 c++filt에 그 변환 된 이름을 입력

$ c++filt -t P3foo 
foo* 
+0

WOW! 흥미 롭 군. 두 가지 질문 .. 1 - C++ filt는 gcc 배포판의 일부 또는 리눅스의 일부입니까? 2 - 메소드 나 클래스의 맹 글링 된 이름을 얻는 방법이 있습니까? 방법으로는 http://www.gnu.org/software/binutils/ –

+0

C++ filt을은 바이너리 유틸리티의 일부 (LD (링커)와 readelf 같은 다른 작은 유틸도에서 온 패키지)입니다 C++에서 그렇게해라. 하지만 GCC에서는 ABI가 노출시키는 기능이 있습니다. cxxabi.h에 있으며 __cxa_demangle이 호출되었습니다. 맹 글링 된 이름을 그냥 전달하십시오. –

+5

없다 : –

17

std::type_info::name()는 구현 고유의 이름을 반환합니다. AFAIK, GCC has one 있지만, "좋은"이름을 얻을 수있는 휴대용 방법은 없습니다. abi::__cxa_demangle()을보십시오.

int status; 
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status); 
std::cout << realname; 
free(realname); 
+0

감사합니다. 현재 프로젝트에서 큰 도움이되었습니다. ('whoami를()'방식 등) 클래스 자체에서 특별 지원없이 –

0

해결 방법은 템플릿이 #include <cxxabi.h>을 해달라고하는 플랫폼

char* 모든 harcoded 형식 이름을 반환 해킹 수 있도록하는 것입니다 휴대용 솔루션이 있습니까?

+1

은 "템플릿은 해킹"할 수있는 유일한 출력 * 정적 * 타입이 아닌 * 동적 * 하나 (다형성 기본 클래스에 대한 포인터를 고려). –

+0

Qt는 메타 객체 시스템에 아주 좋은 반사 메커니즘을 제공합니다. 나는 그것을 매우 추천한다. –