2012-10-13 16 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 नहीं है, लेकिन वहाँ किसी भी तरह से मानव पठनीय परिणाम पाने के लिए है?

कुछ निम्नलिखित की तरह अच्छा होगा enought

const char * 
class string 
+0

जब तक कोई मानक को अद्यतन नहीं जानता, मुझे पता नहीं है, 'टाइपिड' कार्यान्वयन परिभाषित किया गया है, और इस तरह के मान भी लौटते हैं। यदि यह अब मामला नहीं है तो मैं इसके बारे में और जानना बहुत उत्सुक हूं। तब तक, आपके कंपाइलर के लिए विशिष्ट मैंग्लिंग एल्गोरिदम आपको संभावित रूप से उत्तर (और demangling) की ओर ले जाएगा जो आप खोज रहे हैं। – WhozCraig

+0

यह पूर्ण कार्यान्वयन निर्भर है। माइक्रोसॉफ्ट की सीएल आपके नाम की अपेक्षा के समान नामों का उपयोग करेगी। – oldrinb

+0

संबंधित http://stackoverflow.com/questions/81870/is-it-possible-to-print-a-variables-type-in-standard-c –

उत्तर

13

आप उपयोग कर सकते हैं कि (demangle समारोह here से लिया गया), बस याद है कि फोन करने वाले वापसी को मुक्त कराने के लिए जिम्मेदार है के लिए abi::__cxa_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 पर उदाहरण।

+0

यह mingw g ++ पर काम नहीं कर रहा है, प्रोग्राम फेंकने के बिना मर रहा है कोई त्रुटि – srinath29