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 ++?


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.


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.


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


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


-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++) {
.... 
}

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
}

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.