In P ++, i vecchi dati (POD) non hanno informazioni sul tipo di runtime. Le classi descritte prendono esattamente 1 byte e hanno rappresentazioni runtime identiche in qualsiasi compilatore con l'ottimizzazione della classe base vuota.
Come tale ciò che si desidera non può essere fatto.
Aggiunta di un distruttore virtuale alla classe base aggiunta in RTTI e supporto dynamic_cast
.
L'aggiunta di un campo o int
alla base che viene inizializzata in modo diverso per ogni classe derivata funziona anche.
Un'altra opzione è quella di creare una funzione template, e memorizzare un puntatore ad esso, così:
using my_type_id=void(*)();
template<class>void get_my_type_id_helper(){};
template<class T> my_type_id get_my_type_id(){return get_my_type_id_helper<T>;}
e memorizzando un my_type_id
in A
inizializzato appropriatamente. Questo sta reinventando RTTI e, dal momento che si desiderano più funzionalità, ci si avvicina al sovraccarico di C++ RTTI.
In C++ paghi solo quello che chiedi: puoi chiedere lezioni senza RTTI, cosa che hai fatto e ottenerlo.
RTTI è in esecuzione informazioni di tipo orario. Il POD è semplicemente vecchi dati, un termine C++ 03. Molte classi non sono POD: il modo più semplice è aggiungere un distruttore virtual
. C++ 11 ha un layout standard a grana fine e termini aggregati.
Tecnicamente RTTI e POD non sono opposti l'uno all'altro: ci sono classi senza RTTI che non sono POD.
Nota che MSVC ha opzioni per non generare RTTI e il suo aggressivo piegamento di Comdat può rompere il RTTI manuale che ho fatto sopra, in entrambi i casi in violazione dello standard.
Stai chiedendo 'dynamic_cast <>'? Questo non è specifico per C++ 11. –
Non è cambiato nulla: non c'è riflesso nel C++ standard. Se si desidera attivare le informazioni sul tipo di runtime, si 'dynamic_cast' – quantdev
Forse di interesse: http://stackoverflow.com/q/25495733/596781 –