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
}

イデオンの例。

于 2012-10-13T22:28:04.367 に答える