← SEARCHABLE ARCHIVE
C / C++ · 2026-07-22

C++ de los fundamentos al dominio — Lección 13

Reduzca el código duplicado de diferentes tipos con plantillas

INTERACTIVE READING MODE →

Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.

Hay ocasiones en las que la función para encontrar el ID de un artículo y la función para encontrar el ID de un monstruo tienen casi la misma forma. Si solo el tipo de datos es diferente y el comportamiento es el mismo, puede crear reglas comunes utilizando plantillas en lugar de copiar código.

plantilla de función

Comencemos creando una función que devuelva el mayor de los dos valores.

template <typename T>
T Max(const T& a, const T& b)
{
    return a < b ? b : a;
}

int highLevel = Max(10, 20);
float highDamage = Max(12.5f, 8.0f);

Tes un lugar que cambia al tipo real al llamar a una función. el compiladorMax<int>yMax<float>Cree cada función según sea necesario.

peroMax(10, 3.5f)Si se pasan diferentes tipos, la compilación falla porque no se puede determinar una T. Debe hacer coincidir explícitamente los tipos o plantillas de diseño que acepten ambos tipos por separado.

plantilla de clase

Si desea utilizar el mismo tamaño de ranura para varios tipos, también puede crear una clase como plantilla.

template <typename T, std::size_t Size>
class Inventory
{
public:
    T& At(std::size_t index)
    {
        return slots.at(index);
    }

    const T& At(std::size_t index) const
    {
        return slots.at(index);
    }

private:
    std::array<T, Size> slots{};
};

Inventory<Item, 20> itemInventory;
Inventory<Skill, 8> skillInventory;

T es el tipo y Tamaño es un valor determinado en el momento de la compilación. std::arrayDado que el tamaño no cambia en tiempo de ejecución, es bueno para expresar una ranura fija.

Plantillas y archivos de encabezado

Una función normal puede tener su declaración en el encabezado y su definición en cpp. Sin embargo, la definición de una plantilla debe ser visible en el momento en que el compilador crea código para el tipo real.

// Inventory.h
template <typename T>
class Inventory
{
public:
    void Add(const T& value)
    {
        values.push_back(value);
    }

private:
    std::vector<T> values;
};

Por lo tanto, las definiciones de las plantillas generalmente se escriben en el encabezado. Si coloca solo la declaración en el encabezado y oculta la definición en cpp, puede ocurrir un error de enlace porque no se puede encontrar un tipo específico de código.

Criterios para utilizar plantillas.

Si el código es de un tipo diferente pero tiene el mismo significado, una plantilla reduce la duplicación. Por el contrario, si se fuerza código con diferentes acciones y responsabilidades en una sola plantilla, aumentan las declaraciones condicionales y el procesamiento especial.

Las plantillas no son una función que generalice todo el código. Es mejor pensar en ello como una herramienta que aplica de forma segura las mismas reglas a múltiples tipos y evita combinaciones incorrectas en la etapa de compilación.