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

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

以上代码打印 P3foo 在我的 ubuntu 机器上使用 g++。我不明白为什么要打印 P3foo 而不是仅仅 . 。如果我改变代码

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

它打印 3富.

有什么想法吗?

有帮助吗?

解决方案

由于它是一个指针到foo。和Foo有3个字符。因此,它成为P3foo。另一种具有类型foo,因此它成为3foo。请注意,文字是依赖于实现,在这种情况下GCC只是给你的内部,重整名称。

输入该重整名称为程序c++filt得到未重整名:

$ c++filt -t P3foo
foo*

其他提示

std::type_info::name()返回一个实施方式特定的名称。据我所知,没有可移植的方式来获得一个“好”的名字,虽然GCC 有一个。看 abi::__cxa_demangle()

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

有便携式解决方案吗

解决方法是制作一个模板 hack,将所有编码类型名称返回为 char*

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top