Перегрузка операторов для перечислений - PullRequest
10 голосов
/ 03 апреля 2010

Можно ли определить операторы для перечислений? Например, в моем классе есть 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;
    }
}

Ответы [ 2 ]

14 голосов
/ 03 апреля 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 будет сильно зависеть от вашего индивидуального варианта использования.

13 голосов
/ 03 апреля 2010

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

...