19
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

有什么想法吗?

4

3 回答 3

31

因为它是指向 foo 的指针。foo 有 3 个字符。于是就变成了P3foo。另一个有类型foo,所以变成3foo. 请注意,文本是依赖于实现的,在这种情况下,GCC 只是为您提供了内部的、错位的名称。

在程序中输入该损坏的名称c++filt以获取未损坏的名称:

$ c++filt -t P3foo
foo*
于 2009-04-25T18:01:24.103 回答
17

std::type_info::name()返回实现特定的名称。AFAIK,虽然 GCC有一个. 看abi::__cxa_demangle()

int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
于 2010-02-07T14:04:52.730 回答
0

是否有便携式解决方案

解决方法是进行模板破解以将所有硬编码类型名称返回为char*

哪个平台没有#include <cxxabi.h>

于 2010-10-15T18:10:35.070 回答