Страницы

Поиск по вопросам

вторник, 10 декабря 2019 г.

Перегрузка операторов для перечислений

#cpp #перегрузка_операторов


Можно ли перегружать операторы для типа перечисления enum? Если да, то как?

Не нашел запрета, но реализовать не получилось.

Я хочу взять и сделать, например, так: 

Mode t = UP; t++; /*или*/ t+=2;

    


Ответы

Ответ 1



Можно. Обычно делают так: enum class Mode { UP, DOWN }; // Префиксный инкремент. Mode& operator++(Mode& m) { m = static_cast(static_cast(m) + 1); return m; } // Постфиксный инкремент. Mode operator++(Mode& m, int) { Mode old = m; m = static_cast(static_cast(m) + 1); return old; } // Сложение. Mode operator+(const Mode m, const int i) { return static_cast(static_cast(m) + i); } Mode operator+(const int i, const Mode m) { return operator+(m, i); } // Вычитание. Mode operator-(const Mode m, const int i) { return static_cast(static_cast(m) - i); } Mode operator-(const int i, const Mode m) { return operator-(m, i); } // Сложение с присваиванием. Mode& operator+=(Mode& m, int i) { m = operator+(m, i); return m; } // Вычитание с присваиванием. Mode& operator-=(Mode& m, int i) { m = operator-(m, i); return m; } Если используется не enum class, а обычный enum, то внутренний static_cast можно убрать.

Комментариев нет:

Отправить комментарий