2011-09-05 7 views
8

¿Hay alguna forma de sobrecargar a un operador de conversión para convertir entre dos enumeraciones?Operador de conversión de sobrecarga entre dos enumeraciones

En mi código que tengo

enum devStatus 
{ 
    NOT_OPERATING, 
    INITIALISING, 
    DEGRADED, 
    NORMAL 
}; 

enum dataStatus 
{ 
    UNAVAILABLE = 1, 
    DEGRADED, 
    NORMAL 
} 

donde NOT_OPERATING y el mapa de INICIALIZACIÓN DISPONIBLE; Mapa DEGRADADO y NORMAL en línea recta. Estos se arreglan mediante interfaces externas.

Busco una manera de convertir entre devStatus y dataStatus y me gustaría ser capaz de escribir algo como:

devStatus devSts; 
getDeviceStatus(&devSts); 
dataStatus dataSts = (dataStatus)devSts; 

sé que si se trataba de clases, podría escribir devStatus::operator dataStatus() para hacer esto. ¿Hay alguna forma de hacer esto para una enumeración?

tan sólo pudiera tener una función libre dataStatus devStatus2dataStatus(const devStatus& desSts)

Respuesta

13

En C++, los operadores de conversión sólo pueden ser declaradas dentro declaraciones clase, estructura y sindicales. No pueden declararse fuera del tipo (como operador +, por ejemplo). Las declaraciones de tipo Enum no son compatibles con los miembros de la instancia, por lo que deberá ir con la función de conversión. Hacerlo también hará que el código de llamada sea más claro. El siguiente ejemplo demuestra esto, el uso de espacios de nombres personalizados a las enumeraciones alcance y funciones de conversión:

namespace TheirEnum { 
    enum Type { 
     Value1, 
     Value2 
    }; 
} 
namespace MyEnum { 
    enum Type { 
     Value1, 
     Value2 
    }; 

    TheirEnum::Type ToTheirEnum (Type e) { 
     switch (e) { 
     case Value1: return TheirEnum::Value1; 
     case Value2: return TheirEnum::Value2; 
     default: throw std::invalid_argument("e"); 
     } 
    } 
} 

// usage: 
TheirEnum::Type e = MyEnum::ToTheirEnum(MyEnum::Value1); 
+0

¿Cuáles son las ventajas/disadvantes de la definición de una clase para cada enumeración en su lugar, y los operadores de conversión? En el lado negativo, más código repetitivo. Por el lado positivo, ninguna función de conversión flota en el espacio de nombres externo, aunque ya ha dicho que las enumeraciones ya flotan por allí. La eficiencia debe ser idéntica a la optimización del compilador. –

+0

Acepto que el ámbito de nombres para las enums de C++ no es ideal, pero se puede evitar fácilmente envolviendo la declaración enum y la función de conversión con un espacio de nombres, sin tener que pasar por el agujero de la creación de una clase para cada enumeración. Continuar por ese camino trae a colación cuestiones lógicas como la relación is-a/has-a y qué operadores deben/deben proporcionarse para ese tipo. Creo que hacerlo es probablemente excesivo para la mayoría de las enumeraciones. –

+0

Actualicé la respuesta con un ejemplo de declaración de espacio de nombres y uso de muestra. –