2012-02-02 11 views
5

Me gustaría agregar un poco de azúcar sintáctico a una clase al sobrecargar() como método getter. Sin embargo, el método getter toma un argumento de plantilla sin tipo. Consideremos un caso de prueba sencilla:¿Puedo pasar un argumento de plantilla sin tipo a un operador sobrecargado?

#include <iostream> 

class Foo 
{ 
public: 
    template <int i> void get() 
    { 
    std::cout << "called get() with " << i << std::endl; 
    } 
    template <int i> void operator()() 
    { 
    std::cout << "called overloaded() with " << i << std::endl; 
    } 
}; 

int main() 
{ 
    Foo foo; 
    foo.get<1>(); 
    foo.get<2>(); 
    foo<3>(); // error: no match for ‘operator<’ in ‘foo < 3’ 
    return 0; 
} 

Esto compila y se ejecuta como se espera si foo<3>(); esté comentada. ¿La sintaxis de C++ es compatible con lo que estoy tratando de hacer, o debería simplemente darme por vencido y mantener un método determinado para el getter?

+1

No puedo probarlo ahora pero estoy seguro de que la única forma es 'foo.operator() <3>()', lo que probablemente anule el propósito. – PlasmaHH

Respuesta

8

La sintaxis que busca existe, pero no le va a gustar:

foo.operator()<3>(); 

Por lo tanto, se adhieren a la función llamada.

+0

@ Lightness Races in Orbit: nevermind – noisy

0

se podía soportar al poner la plantilla en la clase de este modo:

template<int i> 
class Foo 
{ 
    Foo() 
    { 
     std::cout << "called overloaded() with " << i << std::endl; 
    } 

    static void Get() 
    { 
     std::cout << "called get() with " << i << std::endl; 
    } 
}; 

int main() 
{ 
    Foo<1>::Get(); 
    Foo<3>(); 
    return 0; 
} 

Sin embargo, existe una pequeña pérdida como se puede construir un objeto de Foo cuando se llama a la forma directa().

Además, supongo que su código de la vida real tiene muchas otras cosas en la clase Foo, por lo que probablemente no sea aceptable mover la plantilla a la clase (lo que puede ser un cambio de diseño significativo) solo para administrar esto .

EDIT:

En realidad ya que probablemente ya es una instancia de Foo que el PO está utilizando, toda mi propuesta es tonta. No te molestes.

+0

Estoy totalmente de acuerdo contigo ya que probablemente no sea aceptable mover la plantilla a la clase. No porque sea demasiado precio para realizar una pequeña tarea, sino porque simplemente no logrará * nada * –

Cuestiones relacionadas