Come ottengo il tipo di una variabile?

In C ++, come si trova il tipo di una variabile?

Puoi usare l’operatore typeid :

#include  ... cout << typeid(variable).name() << endl; 

Per un inserimento statico C ++ 11 ha introdotto decltype che è abbastanza utile in alcuni scenari.

Di solito, volendo trovare il tipo di una variabile in C ++ è la domanda sbagliata. Tende ad essere qualcosa che porti avanti da linguaggi procedurali come ad esempio C o Pascal.

Se si desidera codificare comportamenti diversi a seconda del tipo, provare ad apprendere, ad esempio , l’overloading delle funzioni e l’ ereditarietà degli oggetti . Questo non ha senso immediato nel tuo primo giorno di C ++, ma continua a farlo.

Se hai una variabile

 int k; 

Puoi ottenere il suo tipo usando

 cout << typeid(k).name() << endl; 

Vedere la discussione seguente su SO: domanda simile

La principale differenza tra C ++ e Javascript è che C ++ è un linguaggio tipizzato staticamente, wile javascript è dinamico.

Nei linguaggi tipizzati dinamici una variabile può contenere qualsiasi cosa, e il suo tipo è dato dal valore che tiene, momento per momento. Nei linguaggi tipizzati statici, il tipo di una variabile viene dichiarato e non può essere modificato.

Possono esserci dispatch dinamici e composizione di oggetti e sottotipizzazione (ereditarietà e funzioni virtuali) nonché dispostivi statici e superattivi (tramite modello CRTP), ma in ogni caso il tipo di variabile deve essere noto al compilatore.

Se sei nella posizione di non sapere cosa sia o potrebbe essere, è perché hai progettato qualcosa in quanto il linguaggio ha un sistema di tipi dinamico.

Se è così, è meglio ripensare il tuo design, dato che sta entrando in una terra non naturale per la lingua che stai usando (più come andare in autostrada con un bruco o in acqua con un’auto)

Non sono sicuro che la mia risposta sarebbe di aiuto.

La risposta breve è che non hai davvero bisogno / vuoi sapere il tipo di una variabile per usarla.

Se devi dare un tipo a una variabile statica, allora puoi semplicemente usare auto.

Nel caso più sofisticato in cui si desidera utilizzare “auto” in una class o in una struct, suggerirei di utilizzare template con decltype.

Ad esempio, diciamo che stai usando la libreria di qualcun altro e che ha una variabile chiamata “unknown_var” e dovresti metterla in un vettore o in una struct, puoi farlo totalmente:

 template  struct my_struct { int some_field; T my_data; }; vector complex_vector; vector > simple_vector 

Spero che questo ti aiuti.

EDIT: Per buona misura, ecco il caso più complesso che posso pensare: avere una variabile globale di tipo sconosciuto. In questo caso avresti bisogno di c ++ 14 e di template variable.

Qualcosa come questo:

 template vector global_var; void random_func (auto unknown_var) { global_var.push_back(unknown_var); } 

È ancora un po ‘noioso, ma è il più vicino ansible alle lingue senza scrittura. Assicurati che ogni volta che fai riferimento alla variabile del modello, inserisca sempre le specifiche del modello.

Credo di avere un caso d’uso valido per l’uso di typeid (), allo stesso modo in cui è valido usare sizeof (). Per una funzione template, ho bisogno di un caso speciale del codice basato sulla variabile template, in modo da offrire la massima funzionalità e flessibilità.

È molto più compatto e manutenibile rispetto all’uso del polimorfismo, per creare un’istanza della funzione per ciascun tipo supportato. Anche in quel caso potrei usare questo trucco per scrivere il corpo della funzione solo una volta:

Si noti che poiché il codice utilizza i modelli, l’istruzione switch riportata di seguito dovrebbe risolversi staticamente in un solo blocco di codice, ottimizzando tutti i falsi casi, AFAIK.

Considera questo esempio, dove potremmo aver bisogno di gestire una conversione se T è un tipo contro un altro. Lo uso per la specializzazione di class per accedere all’hardware in cui l’hardware utilizzerà il tipo myClassA o myClassB. In caso di mancata corrispondenza, ho bisogno di passare il tempo a convertire i dati.

 switch ((typeid(T)) { case typeid(myClassA): // handle that case break; case typeid(myClassB): // handle that case break; case typeid(uint32_t): // handle that case break; default: // handle that case } 
 #include  ... string s = typeid(YourClass).name()