2010-02-02 10 views

Respuesta

18

Nop.

Si lo hubiera, no se vería tanto código como este:

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

Tenga en cuenta que este código es también un indicio de una solución (desagradable) - si se agrega un "protector" definitiva elemento, y no establece explícitamente los valores de los campos de enumeración, a continuación, el último elemento "cOUNT" tendrá el valor que está buscando - esto sucede porque el recuento de enumeración es cero basada en:

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

Gracias, que parece una solución tan buena como la que voy a llegar a. – rofrankel

+0

Por supuesto, solo funciona para enumeraciones continuas. Si alguna vez tienes un 'hoyo' como en una lista de códigos de error, estás jodido. –

+0

Publiqué una macro simple que hace el truco y maneja los problemas de "agujeros". –

2

No. Por un lado, no se puede tomar como tipos de parámetros (sólo instancias de tipos)

3

No, esto es un VFAQ y la respuesta es NO !!

No

sin kludging de todos modos.

Incluso ese truco acerca con una entrada final sólo funciona si ninguno de los valores no son por defecto. Por ejemplo,

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

Gracias. Perdón por repetir un VFAQ: hice una búsqueda aquí y en la web más grande, y no pude encontrar ninguna instancia de esta pregunta. – rofrankel

+0

No hay problema. Lo he buscado con frecuencia para saber que los gurús dicen "no se dun" – Mawg

4

Hay maneras, pero hay que trabajar un poco ... :)

Básicamente se puede conseguir con una macro.

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

size_t s = count(MyEnum()); 

¿Cómo funciona?

#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_); } 

Tenga en cuenta que la longitud también puede ser una especialización plantilla o lo que sea. No sé ustedes, pero me gusta mucho la expresividad de una "secuencia" en BOOST_PP;)

+1

+1 porque funciona. Aunque no estoy seguro de que me gusta la sintaxis de la declaración. – ScaryAardvark

+0

Bueno, hay algunas estructuras para elegir (array, lista, secuencia y tupla), podría haber utilizado una tupla para 'DEFINE_NEW_ENUM (MyEnum, (Val1, Val2, Val3 = 6));'. Fue simplemente una demostración de la utilidad de las macros :) –

Cuestiones relacionadas