2010-02-02 7 views

risposta

18

Nope.

Se ci fosse, non si vedrebbe così tanto codice come questo:

enum E { 
    VALUE_BLAH, 
    VALUE_OTHERBLAH, 
    ... 
    VALUE_FINALBLAH, 
    VALUE_COUNT 
} 

Si noti che questo codice è anche un suggerimento per una soluzione (brutto) - se si aggiunge una "guardia" finale elemento, e non afferma esplicitamente i valori dei campi enum, quindi l'ultimo elemento "cOUNT" avrà il valore che stai cercando - questo accade perché conteggio enum è a base zero:

enum B { 
    ONE, // has value = 0 
    TWO, // has value = 1 
    THREE, // has value = 2 
    COUNT // has value = 3 - cardinality of enum without COUNT 
} 
+0

Grazie, mi sembra una buona soluzione come sto per venire fuori. – rofrankel

+0

Che naturalmente funziona solo per enumerazioni continue. Se hai mai avuto un 'buco' come in un elenco di codici di errore, sei fregato. –

+0

Ho pubblicato una macro semplice che fa il trucco e gestisce i problemi dei "buchi". –

2

No. Per prima cosa, non puoi prendere tipi come parametri (solo esempi di tipi)

3

No, questo è un VFAQ e la risposta è NO !!

Non senza eccessi.

Anche questo trucco con una voce finale funziona solo se nessuno dei valori è non predefinito. Per esempio,

enum B { 
     ONE, // has value = 0 
     TWO, // has value = 1 
     THREE=8, // because I don't like threes 
     COUNT // has value = 9 
     } 
+0

Grazie. Ci scusiamo per la ripetizione di un VFAQ: ho cercato sia qui che il web più grande e non ho trovato nessuna istanza di questa domanda. – rofrankel

+0

Nessun problema. L'ho cercato abbastanza spesso da sapere che i guru dicono "non si può dun" – Mawg

4

ci sono modi, ma si deve lavorare ... un po ':)

Fondamentalmente si può ottenere con una macro.

DEFINE_NEW_ENUM(MyEnum, (Val1)(Val2)(Val3 = 6)); 

size_t s = count(MyEnum()); 

Come funziona?

#include <boost/preprocessor/seq/enum.hpp> 
#include <boost/preprocessor/seq/size.hpp> 

#define DEFINE_NEW_ENUM(Type_, Values_)\ 
    typedef enum { BOOST_PP_SEQ_ENUM(Values_) } Type_;\ 
    size_t count(Type_) { return BOOST_PP_SEQ_SIZE(Values_); } 

Si noti che la lunghezza potrebbe anche essere una specializzazione di modello o altro. Non so voi, ma mi piace molto l'espressività di una "Sequenza" in BOOST_PP;)

+1

+1 perché funziona. Anche se non sono sicuro che mi piaccia la sintassi della dichiarazione. – ScaryAardvark

+0

Bene, ci sono alcune strutture tra cui scegliere (array, lista, sequenza e tupla), avrei potuto usare una tupla per 'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6));'. Era solo una dimostrazione dell'utilità dei macro :) –

Problemi correlati