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.

Especialización parcial de plantilla en C++ sin duplicación de código.

Tengo una definición de clase con 3 parámetros de plantilla. Me gustaría crear especializaciones de esta clase con combinaciones específicas de 2 de los parámetros, dejando el tercero libre. ¿Cómo puedo hacer eso sin duplicar código?

“`cpp
template <typename a,="" typename="" b,="" class="" c=""> Foo{}; // solo definiendo especializaciones particulares

template<class c=""> Foo<int, float,="" c="">
{
int V1;
float V2;
friend C;
/* implementación usando V1, V2 */
}

template<class c=""> Foo<bool, char,="" c="">
{
bool V1;
char V2;
friend C;
/* implementación duplicada usando V1, V2 */
}

main {

Foo<bool, char="" someclassname=""> fbc;
Foo<int, float,="" otherclassname=""> fif;

}
“`</int,></bool,></bool,></int,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para crear especializaciones de una clase con combinaciones específicas de 2 de los parámetros, dejando el tercero libre, podemos usar la especialización parcial.

    Por ejemplo, supongamos que tenemos una definición de clase con tres parámetros de plantilla:

    template<typename a,="" typename="" b,="" typename="" c="">
    class MyClass {
      // implementación aquí
    };
    

    Para crear especializaciones de esta clase con combinaciones específicas de A y B, podemos hacer una especialización parcial de la clase:

    template<typename a,="" typename="" b,="" typename="" c="">
    class MyClass {
      // implementación general aquí
    };
    
    template<typename a,="" typename="" b="">
    class MyClass<a, b,="" sometype=""> {
      // implementación específica para A y B aquí
    };
    

    En este ejemplo, dejamos libre el tercer parámetro de plantilla (C), pero creamos una implementación específica para combinaciones de A y B. Podemos evitar duplicar código al definir solo las especializaciones específicas que necesitamos.

    Entonces, para aplicar esto a nuestro ejemplo con la clase Foo, podemos crear especializaciones parciales:

    template<typename a,="" typename="" b,="" typename="" c="">
    class Foo {
      // implementación general aquí
    };
    
    template<typename c="">
    class Foo<int, float,="" c=""> {
      int V1;
      float V2;
      friend C;
      // implementación usando V1, V2
    };
    
    template<typename c="">
    class Foo<bool, char,="" c=""> {
      bool V1;
      char V2;
      friend C;
      // implementación usando V1, V2
    };
    

    En este caso, hemos especificado dos especializaciones parciales para Foo, una para la combinación “int, float” y otra para la combinación “bool, char”. Al dejar libre el tercer parámetro de plantilla (C), podemos utilizar estas especializaciones con diferentes tipos de C.</bool,></int,></a,>

Comments are closed.