Enumerations
Enum.4
Определяйте операции над перечислениями для безопасного и удобного использования
Причина
Удобство использования и предотвращение ошибок.
Пример
enum class Day { mon, tue, wed, thu, fri, sat, sun };
Day& operator++(Day& d)
{
return d = (d == Day::sun) ? Day::mon : static_cast<Day>(static_cast<int>(d)+1);
}
Day today = Day::sat;
Day tomorrow = ++today;
Использование static_cast не самое красивое решение, но вариант
Day& operator++(Day& d)
{
return d = (d == Day::sun) ? Day::mon : Day{++d}; // ошибка
}
является бесконечной рекурсией, а написание без приведения с использованием switch для всех случаев — громоздко.
Контроль
Отмечать повторяющиеся выражения с приведением обратно к перечислению.