Действительно ли возможно определить операторы для перечислений? Например, у меня есть перечислимый Месяц в моем классе, и я хотел бы смочь записать ++ my_month.
Спасибо
P.S.
Чтобы постараться не переполняться, я сделал что-то вроде этого:
void Date::add_month()
{
switch(my_month_)
{
case Dec:
my_month_ = Jan;
add_year();
break;
default:
++my_month_;
break;
}
}
Да, это так. Перегрузка оператора может выполняться для всех типов, определенных пользователем. Это включает перечисления.
Да, вы можете:
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 будет сильно зависеть от вашего индивидуального варианта использования.