Si può scrivere una funzione che restituisce il numero di elementi in un enum? Ad esempio, dire che ho definito:C'è un modo per trovare la cardinalità (dimensione) di un enum in C++?
enum E {x, y, z};
Allora f (E) sarebbero tornati 3.
Si può scrivere una funzione che restituisce il numero di elementi in un enum? Ad esempio, dire che ho definito:C'è un modo per trovare la cardinalità (dimensione) di un enum in C++?
enum E {x, y, z};
Allora f (E) sarebbero tornati 3.
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
}
No. Per prima cosa, non puoi prendere tipi come parametri (solo esempi di tipi)
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
}
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 perché funziona. Anche se non sono sicuro che mi piaccia la sintassi della dichiarazione. – ScaryAardvark
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 :) –
Grazie, mi sembra una buona soluzione come sto per venire fuori. – rofrankel
Che naturalmente funziona solo per enumerazioni continue. Se hai mai avuto un 'buco' come in un elenco di codici di errore, sei fregato. –
Ho pubblicato una macro semplice che fa il trucco e gestisce i problemi dei "buchi". –