es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C++: Instanciar método de plantilla basado en sobrecargas de otro método.

Tengo un método (en una clase A) que tiene muchas sobrecargas diferentes, y estoy haciendo una clase B que hereda de A, cambiando el comportamiento del método para realizar una cierta acción antes de hacer lo que originalmente hace. El problema es que este cambio debe hacerse en todas las sobrecargas, lo cual se puede hacer utilizando una plantilla.

En realidad, esto funciona, pero el uso de una plantilla implica poner el nuevo código del método en la declaración de la clase (es decir, en el encabezado), lo cual es algo desordenado, y siento que debe haber una manera de poner el código en un archivo separado. Hay una manera de hacer esto, y sería mover el código del método redefinido B::method() a un archivo separado, e instanciarlo manualmente para cada sobrecarga. Lo cual es bastante tedioso si el número de sobrecargas es grande, y se siente bastante antinatural. Entonces, mi pregunta es: ¿hay alguna manera de decirle directamente al compilador que instancie el método de plantilla B::method() para cada tipo para el cual sería válido? (es decir, para cada tipo para el cual está sobrecargado A::method).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una forma de decirle directamente al compilador que instancie el método de plantilla B::method() para cada tipo para el cual sería válido. Esto se puede lograr utilizando la instanciación explícita de plantillas.

    Para hacer esto, primero declare el método de plantilla en el archivo de encabezado con un cuerpo vacío:

    class B : protected A{
      public:
        template<typename t="">
        void method(T t);
    };
    

    Luego, en un archivo de implementación separado, defina el método de plantilla con el comportamiento deseado:

    template<typename t="">
    void B::method(T t){
      //Realice la acción deseada
      A::method(t);
    }
    

    Finalmente, al final del archivo de implementación, instancie explícitamente el método de plantilla para todos los tipos para los cuales A::method está sobrecargado:

    template void B::method<int>(int);
    template void B::method<double>(double);
    template void B::method<char>(char);
    

    Esto le indica al compilador que cree una instancia del método de plantilla para cada uno de estos tipos. De esta manera, puede tener el comportamiento deseado del método en un archivo separado sin tener que instanciarlo manualmente para cada sobrecarga en el código principal.

Comments are closed.