【问题标题】:human-readable type_info.name() [duplicate]人类可读的 type_info.name() [重复]
【发布时间】:2012-10-04 08:36:05
【问题描述】:

我用g++编译了下面的代码,得到了输出,用cmets写的。

template<class T>
void foo(T t) { cout << typeid(t).name() << endl; }

int main() {
    foo("f");       //emits "PKc"
    foo(string());  //emits "Ss"
}

我知道,type_info.name() 没有标准化,但有什么方法可以获得人类可读的结果?

像下面这样就足够了

const char *
class string

【问题讨论】:

  • 除非有人知道我不知道的标准的更新,否则typeid 是实现定义的,因此它返回的值也是如此。如果不再是这种情况,我也很想知道更多关于它的信息。在那之前,特定于您的编译器的修饰算法可能会引导您找到您正在寻找的答案(和去修饰)。
  • 它完全依赖于实现。 Microsoft 的 cl 将使用类似于您所期望的名称。

标签: c++ typeid


【解决方案1】:

您可以为此使用abi::__cxa_demangle(demangle 函数取自here),请记住调用者负责释放返回:

#include <cxxabi.h>
#include <typeinfo>
#include <iostream>
#include <string>
#include <memory>
#include <cstdlib>

std::string demangle(const char* mangled)
{
      int status;
      std::unique_ptr<char[], void (*)(void*)> result(
        abi::__cxa_demangle(mangled, 0, 0, &status), std::free);
      return result.get() ? std::string(result.get()) : "error occurred";
}

template<class T>
void foo(T t) { std::cout << demangle(typeid(t).name()) << std::endl; }

int main() {
    foo("f");            //char const*
    foo(std::string());  //std::string
}

ideone 上的示例。

【讨论】:

  • 这在 mingw g++ 上不起作用,程序正在死亡而没有抛出任何错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2018-09-10
相关资源
最近更新 更多