Подтвердить что ты не робот

Инкремент и декрементация "класса enum"

Как известно, приращение и декрементация enum в С++ 03 является незаконным, поскольку С++ 03 enum может быть не непрерывным. Но стандарт С++ 11 представил новую конструкцию enum class, которая, согласно Википедии, более безопасна для типов, потому что она не построена на любом простом счетном типе. Итак, если у нас есть ограниченный список значений перечисления, мы можем написать что-то вроде

enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;

и будет ли он работать правильно (например, приращение White вернется Black, а декремент Black вернет White)?

Если мы не сможем написать такой код, знаете ли вы какие-либо поведенческие классы либо из boost, либо из Qt, которые предоставляют нам эту функцию (правильное вложение и уменьшение)?

4b9b3361

Ответ 1

это будет работать правильно

Нет. enum не предназначен для "обтекания" так, как вы описываете по умолчанию.

И enum class С++ 11 не гарантирует смежные значения, так же, как вы описываете для enum С++ 03.

Вы можете определить поведение обёртывания для вашего конкретного перечисления. Это решение предполагает, что значения являются смежными, как и перечисленные вами перечисления.

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;
}