Saltar al contenido principal
eLearner.app
Módulo 8 · Lección 2 de 218/18 en el curso~15 min
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.

Code
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):

Code
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:

Code
// 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

Ejercicio#cpp.m8.l2.e1
Intentos: 0Cargando...

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.

Cargando editor...
Mostrar pista

Recuerda anteponer `template <typename T>` a la declaración de la clase `Box`.

Solución disponible después de 3 intentos

Ejercicio#cpp.m8.l2.e2
Intentos: 0Cargando...

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).

Cargando editor...
Mostrar pista

Usa `template <>` para indicar la especialización total de `Wrapper<char>`.

Solución disponible después de 3 intentos