2010-08-21 3 views
5

Ho un'enumerazione chiamato StackID, e per tutto il mio codice devo static_cast a int un bel po '- per esempioEsiste un'alternativa all'utilizzo di static_cast <int> per tutto il tempo?

StackID somestack; 
int id = static_cast<int>(somestack); 

Esiste un'alternativa stenografica per eseguire questo cast più e più volte? Ho sentito parlare di conversioni "implicite" - è qualcosa che posso usare qui?

(possibilmente correlate al this question)

+4

cosa ti fa pensare è necessario lanciare loro a tutti? Possono rimanere enumerati per la maggior parte degli usi dell'enum. – rettops

+0

La cosa da fare con un enum è trattarlo come un suo vero tipo. Il tuo codice non dovrebbe essere 'int id' dovrebbe essere' StackID id = somestack'. Non dovrebbe mai essere impostato da un valore int, ma solo dalle costanti enum. –

risposta

10

C'è qualcosa che si dovrebbe usare invece? Probabilmente no. Se stai facendo enum getta a int mi chiedo se si sta utilizzando correttamente enumerazioni (o se stai avendo per interfacciarsi con un vecchie API.) Detto questo non si deve a static_cast enumerazioni a int. Questo succederà naturalmente.

Vedi this articolo di MSN su enumerazioni e enum-> int e INT> enum (dove c'è bisogno di utilizzare uno static_cast.)

+2

+1 su non usare le enumerazioni correttamente. – casablanca

+1

Forse chiarire "che succederà naturalmente"? Per essere precisi, è possibile sostituire 'int id = static_cast (somestack);' con 'int id = somestack;', se si vuole. Qualcuno che legge il codice è quindi meno incline a rendersi conto che sta avvenendo una conversione, ma se la tua enumerazione riguarda solo un piccolo intervallo di valori (inferiore a MAX_INT), probabilmente non importa. –

+0

@Steve Jessop: si potrebbe anche introdurre uno static_assert per verificare che il 'enum' non fuoriesca sopra i contorni. Un confronto delle dimensioni relative (con 'sizeof') potrebbe aiutare enormemente. –

0

valori Enum partiranno da zero per impostazione predefinita e continuare a crescere. Fondamentalmente, le costanti enum sono costanti intere. Non c'è bisogno di convertirli tipicamente in int in modo esplicito. Quando vogliamo rappresentare più costanti come i codici di errore con valori univoci, invece delle istruzioni #define, possiamo fare uso di Enum.

2

Esiste un'alternativa stenografica per eseguire questo cast più e più volte?

Beh, non lo sai., È il vostro giorno fortunato! Perché, sì, c'è un modo più semplice:

int id = somestack; 

Qualsiasi valore enum è implicitamente convertibile in un int.

In ogni caso, dalle tue due domande riguardo a questo problema, mi unirò alle voci interessate chiedendo se un enum è davvero quello che vuoi qui. (Non sto dicendo che è strizzare, so troppo poco sul problema di sapere che. Ma da quello che so mi sembra discutibile.)

Problemi correlati