0Pricing
C++ Academy · Lección

Especialización parcial y completa de plantillas

Especialice plantillas para tipos concretos y patrones parciales de parámetros.

Especialización parcial y completa de plantillas es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Cuando la forma genérica no es suficiente

A veces, un tipo específico necesita un comportamiento personalizado. La especialización de plantillas permite proporcionar una implementación adaptada a un argumento concreto.

Especialización completa

Especifique los tipos exactos y proporcione una alternativa completa.

template <typename T>
struct Printer {
    void print(T x) { std::cout << x; }
};

template <>
struct Printer<bool> {
    void print(bool x) { std::cout << (x ? "true" : "false"); }
};

Uso de una especialización

El compilador selecciona automáticamente la especialización cuando los tipos coinciden.

Printer<int>  pi;  pi.print(42);     // 42
Printer<bool> pb;  pb.print(true);   // true

Especialización de una plantilla de función

También puede especializar plantillas de funciones, pero es preferible sobrecargarlas. Las sobrecargas se combinan mejor con las reglas normales de búsqueda.

template <typename T> void f(T x) { /* general */ }
template <> void f<int>(int x) { /* int specific */ }

Por qué es preferible sobrecargar a especializar funciones

La especialización de una plantilla de función no participa en la resolución de sobrecargas de la misma manera. Las sobrecargas son más claras y evitan la trampa de «¿Por qué no se llama a mi especialización?».

Especialización parcial (solo clases)

La especialización parcial permite adaptar una plantilla a una categoría de tipos, como punteros, referencias o cualquier contenedor.

template <typename T>
struct Type { static const char* name() { return "general"; } };

template <typename T>
struct Type<T*> { static const char* name() { return "pointer"; } };

template <typename T>
struct Type<std::vector<T>> { static const char* name() { return "vector"; } };

Casos de uso de la especialización parcial

Escenarios habituales:

  • Comportamiento diferente para tipos puntero
  • Versión optimizada para tipos copiables trivialmente
  • Sobrescrituras específicas para contenedores

Especialización de plantillas de std

Puede especializar plantillas en el espacio de nombres std (con ciertas restricciones), normalmente std::hash para tipos definidos por el usuario, de modo que puedan almacenarse en std::unordered_map.

template <>
struct std::hash<MyType> {
    size_t operator()(const MyType& v) const {
        return /* compute hash */;
    }
};

Cuándo usar la especialización

Use la especialización cuando:

  • Un tipo necesite un comportamiento fundamentalmente diferente
  • Necesite rutas de código optimizadas para tipos conocidos
  • Se esté integrando con una biblioteca genérica que use traits

Alternativas en el C++ moderno

C++17 añadió if constexpr y C++20 añadió conceptos; ambas características suelen sustituir la especialización por un código más claro.

template <typename T>
void print(const T& x) {
    if constexpr (std::is_same_v<T, bool>) {
        std::cout << (x ? "true" : "false");
    } else {
        std::cout << x;
    }
}

Jerarquía de especializaciones

Cuando se pueden aplicar varias especializaciones, se selecciona la más específica. El compilador elige una de forma inequívoca o genera un error.

Errores habituales

Hay dos errores principales:

  • Olvidar template <> en una especialización completa
  • Colocar especializaciones en archivos de cabecera sin inline, lo que provoca infracciones de la ODR

Comprobación rápida

¿Qué tipo de especialización no se permite directamente para las plantillas de funciones?

Resumen

La especialización de plantillas proporciona implementaciones específicas para cada tipo. La especialización completa fija todos los parámetros; la especialización parcial (solo para plantillas de clases) se adapta a categorías de tipos. Las alternativas modernas, como if constexpr y los conceptos, suelen producir un código más claro.

Preguntas frecuentes

¿La lección «Especialización parcial y completa de plantillas» es gratis?

Sí — el texto completo de «Especialización parcial y completa de plantillas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Especialización parcial y completa de plantillas»?

Especialice plantillas para tipos concretos y patrones parciales de parámetros. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Especialización parcial y completa de plantillas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Repaso de plantillas de funciones y clases
  2. Especialización parcial y completa de plantillas
  3. Plantillas variádicas y paquetes de parámetros
  4. Funciones constexpr e if constexpr
← Volver a C++ Academy