2012-10-13 40 views
7

我用g++編譯了下面的代碼,並得到了輸出,它寫在註釋中。人類可讀的type_info.name()

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()不standartized,但有什麼辦法讓人類可讀的結果嗎?

像下面這樣會好到足夠多的

const char * 
class string 
+0

除非有人知道我不知道標準的更新,'typeid'是實現定義的,因此它返回的值也是如此。如果這不再是這種情況,我很想知道更多關於它的情況。在此之前,特定於編譯器的mangling算法可能會引導您尋找所需的答案(和解除合併)。 – WhozCraig

+0

完全依賴實施。微軟的cl會使用類似於你期望的名字。 – oldrinb

+0

相關http://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in​​-standard-c –

回答

13

您可以使用abi::__cxa_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

+0

這不適用於mingw g ++,該程序正在死亡而不會拋出任何錯誤 – srinath29