para - enum type c++ example
Incremento y decremento de la "clase de enumeraciĆ³n" (1)
Como sabemos, el incremento y la disminución de la enum
en C ++ 03 es ilegal, ya que la enum
C ++ 03 puede no ser continua. Pero el estándar C ++ 11 introdujo la nueva construcción de enum class
, que, según Wikipedia, es más segura para los tipos porque no está basada en ningún tipo contable simple. Entonces, si tenemos una lista limitada de valores de una enumeración, ¿podemos escribir algo como
enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;
y ¿funcionará correctamente (por ejemplo, el incremento de White
devolverá Black
y la disminución de Black
devolverá White
)?
Si no podemos escribir dicho código, ¿conoce alguna clase de comportamiento, ya sea de boost
o de Qt
que nos proporcione esta característica (correcto en y decremento)?
funcionará correctamente
No. Las enum
no están diseñadas para "ajustarse" de la manera que describe de forma predeterminada.
Y la enum class
C ++ 11 no garantiza valores contiguos, como se describe en la enum
C ++ 03.
Sin embargo, puede definir el comportamiento de ajuste para su enumeración particular. Esta solución supone que los valores son contiguos , como la enumeración que describió.
enum class Colors { Black, Blue, White, END_OF_LIST };
// Special behavior for ++Colors
Colors& operator++( Colors &c ) {
using IntType = typename std::underlying_type<Colors>::type
c = static_cast<Colors>( static_cast<IntType>(c) + 1 );
if ( c == Colors::END_OF_LIST )
c = static_cast<Colors>(0);
return c;
}
// Special behavior for Colors++
Colors operator++( Colors &c, int ) {
Colors result = c;
++c;
return result;
}