문제

class foo
{
public:
  void say_type_name()
  {
    std::cout << typeid(this).name() << std::endl;
  }
};

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

위의 코드 인쇄 P3foo g ++가있는 우분투 머신에서. 나는 그것이 인쇄하는 이유를 얻지 못한다 P3foo 그냥 대신 foo. 코드를 변경하면

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

인쇄 3foo.

이견있는 사람?

도움이 되었습니까?

해결책

Foo에 대한 포인터이기 때문입니다. 그리고 Foo에는 3자가 있습니다. 그래서 그것은됩니다 P3foo. 다른 하나에는 유형이 있습니다 foo, 그래서 그것은됩니다 3foo. 텍스트는 구현 의존적 이며이 경우 GCC는 내부의 엉망인 이름 만 제공합니다.

그 엉망인 이름을 프로그램에 입력하십시오 c++filt 앵그른 이름을 얻으려면 :

$ c++filt -t P3foo
foo*

다른 팁

std::type_info::name() 구현 특정 이름을 반환합니다. afaik, "좋은"이름을 얻는 휴대용 방법은 없습니다. 하나가 있습니다. 보다 abi::__cxa_demangle().

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

휴대용 솔루션이 있습니까?

해결 방법은 템플릿 핵을 만들기 위해 템플릿 해킹을하는 것입니다. char*

어떤 플랫폼이 없는지 #include <cxxabi.h>?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top