typeid ()는 g ++에서 추가 문자를 반환합니다
-
16-09-2019 - |
문제
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>
?
제휴하지 않습니다 StackOverflow