我编写了以下代码g++,并得到了输出,这些代码写在注释中.
template<class T>
void foo(T t) { cout << typeid(t).name() << endl; }
int main() {
foo("f"); //emits "PKc"
foo(string()); //emits "Ss"
}
Run Code Online (Sandbox Code Playgroud)
我知道,这type_info.name()不是标准化的,但有没有办法获得人类可读的结果?
像下面这样的东西会很好
const char *
class string
Run Code Online (Sandbox Code Playgroud)
Jes*_*ood 16
您可以使用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
}
Run Code Online (Sandbox Code Playgroud)
关于ideone的示例.