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

Можно ли определить операторы для перечислений? Например, у меня в классе есть enum Month, и я хотел бы написать ++my_month.
Спасибо
P.S.
Чтобы избежать переполнения, я сделал что-то вроде этого:

void Date::add_month()
{
    switch(my_month_)
    {
    case Dec:
        my_month_ = Jan;
        add_year();
        break;
    default:
        ++my_month_;
        break;
    }
}

person There is nothing we can do    schedule 03.04.2010    source источник


Ответы (2)


Да, это так. Перегрузка операторов может выполняться для всех пользовательских типов. Это включает в себя перечисления.

person sellibitze    schedule 03.04.2010
comment
Месяц &оператор++(Месяц &en) { en = static_cast‹Месяц›(static_cast‹int›(en) + 1); вернуться ан; } - person Stephen; 03.04.2010
comment
Спасибо, Стивен, за код. Остается только подумать, что должна делать функция, если месяц уже декабрь. По модулю кто-нибудь? - person sellibitze; 03.04.2010
comment
@Stephen: вам не нужно приводить к int, перечисления преобразуются в int (или больше, если необходимо) неявно для арифметических операций. - person Steve Jessop; 03.04.2010

Да, ты можешь:

enum Month
{
  January,
  February,
  // ... snip ...
  December
};

// prefix (++my_month)
Month& operator++(Month& orig)
{
  orig = static_cast<Month>(orig + 1); // static_cast required because enum + int -> int
  //!!!!!!!!!!!
  // TODO : See rest of answer below
  //!!!!!!!!!!!
  return orig;
}

// postfix (my_month++)
Month operator++(Month& orig, int)
{
  Month rVal = orig;
  ++orig;
  return rVal;
}

Однако вам нужно принять решение о том, как справиться с «переполнением» вашего перечисления. Если my_month равен декабрю, и вы выполняете оператор ++my_month, my_month по-прежнему станет числовым эквивалентом декабря + 1 и не будет иметь соответствующего именованного значения в перечислении. Если вы решите разрешить это, вы должны предположить, что экземпляры перечисления могут быть за пределами. Если вы решите проверить orig == December перед его увеличением, вы можете перенести значение обратно в январь и устранить эту проблему. Затем, однако, вы потеряли информацию, которую вы перенесли на новый год.

Реализация (или ее отсутствие) раздела TODO будет сильно зависеть от вашего индивидуального варианта использования.

person Patrick Johnmeyer    schedule 03.04.2010