Valores máximos y mínimos en una enumeración de C ++

81

¿Hay alguna manera de encontrar los valores definidos máximo y mínimo de una enumeración en c ++?

Mate
fuente
Eche un vistazo a github.com/Neargye/magic_enum lib
dalle
1
Una razón por la que podría querer saber el valor máximo de una enumeración sin agregarla a la enumeración en sí es para que mi compilador no se queje (C4061) cuando mi declaración 'switch' no maneja explícitamente el valor del "valor máximo".
snips-n-snails

Respuestas:

94

No, no hay forma de encontrar los valores definidos máximo y mínimo de cualquier enumeración en C ++. Cuando se necesita este tipo de información, a menudo es una buena práctica definir un valor Último y Primero. Por ejemplo,

enum MyPretendEnum
{
   Apples,
   Oranges,
   Pears,
   Bananas,
   First = Apples,
   Last = Bananas
};

No es necesario nombrar valores para cada valor entre Firsty Last.

Jeff Yates
fuente
3
Sigue siendo útil para enumeraciones no secuenciales, siempre que no espere que existan todos los valores
Adrian Cornish
@Adrian: Sí, eso es cierto. No es necesario que todos los valores tengan un nombre definido para que esta técnica sea útil. Editaré en consecuencia
Jeff Yates
ok, pero tienes que mantener su valor si se agregan nuevos.
Matt
30

No, no en C ++ estándar. Podrías hacerlo manualmente:

enum Name
{
   val0,
   val1,
   val2,
   num_values
};

num_values contendrá el número de valores en la enumeración.

dalle
fuente
num_values ​​contendrá los números-1 de los valores
4pie0
12
@lizusek: num_valuescontendrá el número de valores en la enumeración, excepto él num_valuesmismo.
dalle
3
@dalie sí, es por eso que será: número de valores - 1. Por supuesto que sé que te refieres a valores que significan valores excluyendo el último que no es un valor real, sino un ayudante. Sin embargo, sugeriría hacerlo más claro.
4pie0
1
@dalle Solo si val0 = 0
user2470258
@ user2470258 como se define arriba, siempre es 0.
dalle
6

No. Una enumeración en C o C ++ es simplemente una lista de constantes. No existe una estructura superior que contenga tal información.

Por lo general, cuando necesito este tipo de información, incluyo en la enumeración un valor máximo y mínimo como esto:

enum {
  eAaa = 1,
  eBbb,
  eCccc,
  eMin = eAaaa,
  eMax = eCccc
}

Consulte esta página web para ver algunos ejemplos de cómo esto puede ser útil: Trucos estúpidos de enumeración

Justsalt
fuente
el artículo que enlaza es de una época en la que el compilador de los autores "no es compatible con el nuevo tipo booleano oficial de C ++" ... Nunca había leído algo tan antiguo antes: P.
idclev 463035818
4
  enum My_enum
    {
       FIRST_VALUE = 0,

       MY_VALUE1,
       MY_VALUE2,
       ...
       MY_VALUEN,

       LAST_VALUE
    };

después de la definición, My_enum :: LAST_VALUE == N + 1

Tiendil
fuente
-1

No automáticamente, pero puede agregar valores de enumeración artificiales para indicar valores mínimos y máximos, por ejemplo

typedef enum {start_of_colors=-1, eRed, eWhite, eBlue, eGray,
end_of_colors} eListOfTags;

for (eListOfTags i = start_of_colors+1; i < end_of_colors; i++) {
.... 
}
wannes
fuente
1
considere agregar una descripción para ayudar con la respuesta.
Bibberty
-5

ni siquiera los necesitas, lo que hago es solo digo por ejemplo si tienes:

enum Name{val0,val1,val2};

si tiene una declaración de cambio y para verificar si se alcanzó el último valor, haga lo siguiente:

if(selectedOption>=val0 && selectedOption<=val2){

   //code
}
Wael
fuente
15
Esta es una solución muy frágil. Si agrega un nuevo valor de enumeración, debe examinar toda su base de código para actualizar dichas pruebas.
Marcelo Cantos