2010-04-03 12 views
9

¿Es posible definir operadores para enumeraciones? Por ejemplo, tengo Enum Month en mi clase y me gustaría poder escribir ++ my_month.
Gracias
P.S.
Con el fin de evitar el desbordamiento hice algo como esto:Sobrecarga de operadores para enumeraciones

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

Respuesta

11

sí lo es. La sobrecarga del operador se puede hacer para todos los tipos definidos por el usuario. Eso incluye enumeraciones.

+2

Mes y operador ++ (Month & en) { es = static_cast (static_cast (en) + 1); return en; } – Stephen

+0

Gracias, Stephen, por el código. Uno solo tiene que pensar en lo que debería hacer la función, si el mes ya es diciembre. Modulo alguien? – sellibitze

+0

@Stephen: no necesita el molde para int, enums convierte a int (o más grande, si es necesario) implícitamente para operaciones aritméticas. –

12

Sí, se puede:

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; 
} 

Sin embargo, usted tiene que tomar una decisión acerca de cómo manejar "desbordamiento" de su enumeración. Si my_month es igual a diciembre y ejecuta la instrucción ++my_month, my_month pasará a ser numéricamente equivalente a diciembre + 1 y no tendrá el valor nominal correspondiente en la enumeración. Si eliges permitir esto, debes asumir que las instancias de la enumeración podrían estar fuera de límites. Si elige verificar orig == December antes de incrementarlo, puede ajustar el valor a enero y eliminar esta preocupación. Luego, sin embargo, ha perdido la información que ha transferido a un nuevo año.

La implementación (o la falta de ella) de la sección TODO dependerá en gran medida de su caso de uso individual.

Cuestiones relacionadas