Esiste comunque la possibilità di ottenere le informazioni typeid
in fase di compilazione da GCC con RTTI disabilitato? In Visual Studio, un comando semplice come const char* typeName = typeid(int).name();
restituirà "int" correttamente, anche se RTTI è disabilitato. Sfortunatamente, GCC non può fare lo stesso. Quando provo a chiamare typeid
senza RTTI, il mio programma si arresta in modo anomalo. So che disabilitare RTTI non fa parte dello standard, ma è comunque possibile forzare GCC a eseguire la risoluzione temporale della compilazione di tipi noti?Tempo di compilazione typeid senza RTTI con GCC
RTTI è disabilitato per motivi di prestazioni. Non ho bisogno di runtime RTTI.
Edit:
Ecco quello che ho finito per andare con:
template<typename T> const char* TypeName(void);
template<typename T> const char* TypeName(T type) { return TypeName<T>(); }
#define REFLECTION_REGISTER_TYPE(type) \
template <> const char* TypeName<type>(void) { return #type; }
Richiede che REFLECTION_REGISTER_TYPE
essere chiamato per ogni tipo che ha bisogno di informazioni riflessione. Ma finché viene chiamato per ogni tipo richiesto, chiamare TypeName<int>
funziona perfettamente. Ho anche aggiunto la funzione TypeName(T type)
che significa che puoi fare cose come questa: int x = 0; printf(TypeName(x));
e stamperà "int". GCC dovrebbe essere davvero in grado di farlo in fase di compilazione come può fare VC++.
motivi di ciò che le prestazioni Siete preoccupati? RTTI è essenzialmente gratuito, salva un overhead di dimensioni binarie. –
@Kyle: in g ++ con RTTI abilitato, 'typeid (int) .name()' restituirà "i" not "int". È rilevante? –
@R. Martinho Fernandes: GCC ha alcune funzioni distruttive che possono trasformare "i" in "int". – Kyle