2009-09-07 38 views
8

¿Es posible sobrecargar los operadores de la clase C++ en el contexto estático? p.ej.C++ sobrecarga del operador estático

class Class_1{ ... } 
int main() 
{ 

    Class_1[val]... 

} 
+0

En caso de 'CLASS_1 [val]' rendimiento de una ¿tipo? ¿Como esperas hacer 'Class_1 [val] v;'? –

+1

Iba a tener valores integrales, pero los tipos son buenos. – jameszhao00

+0

En C++, los tipos no se pueden representar en el sistema de tipos (solo hay 'std :: type_id') y no puedo pensar en ningún operador que pueda sobrecargarse estáticamente. Sugiero que, en lugar de preguntar si tu idea de implementación es factible en C++, presentas el _problema_ real que se pretendía resolver. Alguien podría sugerir una implementación factible. – sbi

Respuesta

13

Si está buscando metaprogramación con el operador integrado: Tal cosa no es posible: los operadores integrados operan en valores de tiempo de ejecución, no en valores de tiempo de compilación.

Es posible utilizar boost::mpl para eso, y en lugar de utilizar los operadores internos, utilizar sus plantillas, como at para op[], plus<a, b> para op+ etc.

int main() { 
    using boost::mpl::vector; 
    using boost::mpl::at_c; 
    using boost::mpl::plus; 
    using boost::mpl::int_; 

    typedef vector<int, bool, char, float> Class_1; 
    typedef vector< int_<1>, int_<2> > Numeric_1; 

    at_c<Class_1, 0>::type six = 6; 
    typedef plus<at_c<Numeric_1, 0>::type 
       ,at_c<Numeric_1, 1>::type>::type r; 
    int i3[r::value] = { 4, 5, 6 }; 
    return ((i3[0] + i3[1] + i3[2]) * six) == 90; 
} 
3

Si se refiere a que el operador actúa sobre una clase, el No. Eso no tiene sentido, es como decir operator + pueden operador en int o double. Los operadores son azúcar sintáctico para funciones y operan en varibles (valores) no en tipos.

+1

Tiene sentido si tiene algún tipo de clase de utilidad, con solo miembros estáticos, que carga algo a "sí mismo", al que le gustaría acceder de la manera más simple, usando un operador como '[]'. –

+1

Sí, agregando al comentario de @ jave.web: ciertamente puede tener sentido en casos * cuando hay datos en el alcance * estático de la clase. (El OP también menciona el alcance estático explícitamente). Por lo tanto, no con aritméticas simples, como en su ejemplo, pero cosas como [],(), <<, >> etc. podrían ser azúcar sintáctica perfecta para cualquier tipo de clases complejas de administrador, también sin forzar una instancia singleton –

5

No creo que sea posible, aunque podría estar equivocado en este frente. Sin embargo, me gustaría preguntar por qué querrías hacer esto. En lugar de realizar operaciones en una clase en lugar de instancias, ¿tal vez solo requiera una instancia en toda la aplicación? En este caso, probablemente debería estar usando the singleton pattern.

+1

Solía ​​usar el patrón singleton como loco, pero luego se detuvo porque el código singleton es una molestia para escribir pruebas. – jameszhao00

1

No, los operadores no pueden ser miembros estáticos de una clase. Use una función estática regular en su lugar.