9

我用 编译了以下代码g++,并得到了输出,它写在注释中。

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
4

1 回答 1

17

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

#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上的示例。

于 2012-10-13T22:28:04.367 回答