Lecciones del módulo (2/2)
Clases Plantilla
Al igual que con las funciones, las clases también se pueden parametrizar con respecto a uno o más tipos de datos. Esto nos permite definir estructuras de datos genéricas (como listas, colas, pilas o wrappers) que funcionan con cualquier tipo de datos sin tener que duplicar el código.
Definición de una Clase Template
Para declarar una clase plantilla, utilizamos la sintaxis template <typename T> inmediatamente antes de la definición de la clase. Dentro de la clase, podemos utilizar el parámetro de tipo T para definir variables miembro, tipos de retorno o parámetros de funciones miembro.
template <typename T>
class Box {
private:
T value;
public:
Box(T v) : value(v) {}
T getValue() const {
return value;
}
};
Instanciación
Cuando creamos un objeto de una clase plantilla, debemos especificar explícitamente el tipo entre paréntesis angulares <> (aunque a partir de C++17 el compilador puede deducirlo en algunos contextos a través de la Class Template Argument Deduction o CTAD):
Box<int> intBox(10); // T si converte in int
Box<double> doubleBox(3.14); // T si converte in double
Especialización de Templates
A veces deseamos un comportamiento diferente para una clase plantilla cuando se instancia con un tipo específico. En este caso, definimos una especialización total utilizando la sintaxis template <> seguida de la definición de la clase en la que especificamos el tipo objetivo:
// Specializzazione totale per il tipo bool
template <>
class Box<bool> {
private:
bool value;
public:
Box(bool v) : value(v) {}
void printState() {
std::cout << (value ? "Vero" : "Falso");
}
};
Pruébalo tú mismo
Declara una clase plantilla llamada Box que contenga un miembro privado llamado value de tipo T, un constructor que lo inicialice y un método público getValue() const que devuelva el valor.
Mostrar pista
Recuerda anteponer `template <typename T>` a la declaración de la clase `Box`.
Solución disponible después de 3 intentos
Declara una clase plantilla Wrapper<T> con un miembro público data de tipo T, un constructor Wrapper(T d) y un método print() que imprima data en std::cout. Posteriormente, crea una especialización total para Wrapper<char> en la que el método print() imprima el carácter encerrado entre comillas simples (ej. 'A' en lugar de A).
Mostrar pista
Usa `template <>` para indicar la especialización total de `Wrapper<char>`.
Solución disponible después de 3 intentos