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,>
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:
Para crear especializaciones de esta clase con combinaciones específicas de A y B, podemos hacer una especialización parcial de la clase:
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:
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,>