class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
上面的代码使用g ++在我的ubuntu机器上打印 P3foo 。我不明白它为什么打印 P3foo 而不仅仅是 foo 。如果我更改代码
std::cout << typeid(*this).name() << std::endl;
打印 3foo 。
有什么想法吗?
答案 0 :(得分:31)
因为它是指向foo的指针。 foo有3个字符。所以它变成了P3foo
。另一个类型为foo
,因此它变为3foo
。请注意,文本是依赖于实现的,在这种情况下,GCC只会为您提供内部的错位名称。
将该受损名称输入程序c++filt
以获取未编号的名称:
$ c++filt -t P3foo
foo*
答案 1 :(得分: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);
答案 2 :(得分:0)
是否有便携式解决方案
解决方法是制作模板hack以将所有已编码的类型名称返回为char*
哪个平台没有#include <cxxabi.h>
?