Операторы, перегружающиеся для перечислений

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

void Date::add_month()
{
    switch(my_month_)
    {
    case Dec:
        my_month_ = Jan;
        add_year();
        break;
    default:
        ++my_month_;
        break;
    }
}
12
задан There is nothing we can do 3 April 2010 в 15:45
поделиться

2 ответа

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

13
ответ дан 2 December 2019 в 05:03
поделиться

Да, вы можете:

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 == декабрь , прежде чем увеличивать его, вы можете вернуть значение к январю и устранить эту проблему. Однако затем вы потеряли информацию, которую перенесли на новый год.

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

17
ответ дан 2 December 2019 в 05:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: