Acabo de darme cuenta de que no se pueden utilizar operadores matemáticos estándar en un enum como ++ o +=
Entonces, ¿cuál es la mejor manera de iterar a través de todos los valores en un enum de C++?
La forma típica es la siguiente:
enum Foo {
One,
Two,
Three,
Last
};
for ( int fooInt = One; fooInt != Last; fooInt++ )
{
Foo foo = static_cast<Foo>(fooInt);
// ...
}
Tenga en cuenta que el enum Last
está destinado a ser omitido por la iteración. Utilizando este "falso" enum Last
, no tiene que actualizar su condición de terminación en el bucle for al último "real" enum cada vez que quiera añadir un nuevo enum.
Si quiere añadir más enumeraciones más tarde, sólo tiene que añadirlas antes de Last. El bucle de este ejemplo seguirá funcionando.
Por supuesto, esto se rompe si se especifican los valores de los enum:
enum Foo {
One = 1,
Two = 9,
Three = 4,
Last
};
Esto ilustra que un enum no está realmente pensado para iterar. La forma típica de tratar con un enum es utilizarlo en una sentencia switch.
switch ( foo )
{
case One:
// ..
break;
case Two: // intentional fall-through
case Three:
// ..
break;
case Four:
// ..
break;
default:
assert( ! "Invalid Foo enum value" );
break;
}
Si realmente quiere enumerar, ponga los valores del enum en un vector e itere sobre él. Esto también tratará adecuadamente los valores de enum especificados.