2012-10-13 8 views
7

Ho compilato il codice seguente con g++ e ottenuto l'output, che è scritto nei commenti.leggibile dall'uomo 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" 
} 

lo so, che non è type_info.name() standartized, ma c'è un modo per ottenere risultati leggibili?

qualcosa come il seguente sarebbe bene enought

const char * 
class string 
+0

A meno che qualcuno non conosca un aggiornamento dello standard di cui non sono a conoscenza, 'typeid' è definito dall'implementazione, e come tale i valori che restituisce. Se questo non è più il caso, sono molto curioso di saperne di più a riguardo. Fino a quel momento, l'algoritmo di mangling specifico per il compilatore ti condurrà probabilmente alla risposta (e al problema) che stai cercando. – WhozCraig

+0

È totalmente dipendente dall'implementazione. Cl di Microsoft utilizzerà nomi simili a quello che ti aspetti. – oldrinb

+0

correlati http://stackoverflow.com/questions/81870/is-it-possibile-in-prodotto-a-variabile-tipo-in-standard-c –

risposta

13

È possibile utilizzare abi::__cxa_demangle per quella (funzione demangle tratto da here), bisogna ricordare che il chiamante è responsabile di liberare il ritorno:

#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 
} 

Esempio su ideone.

+0

Questo non funziona su mingw g ++, il programma sta morendo senza lanciare qualsiasi errore – srinath29

Problemi correlati