Especialización Parcial de Plantillas
Desliza para mostrar el menú
La especialización de plantillas para una plantilla de un solo parámetro es sencilla, pero se vuelve más compleja con múltiples parámetros. Aquí es donde entra la especialización parcial de plantillas. Permite crear una versión especializada de una plantilla para subconjuntos específicos de tipos o valores.
main.cpp
12345678// What if `T1` and `T2` are the same type? // Or what if you want to define special behavior when `T1` is a `std::string`? template<typename T1, typename T2> void TemplateExample(T1 first, T2 second) { std::cout << "Generic template!" << std::endl; }
Sintaxis de la especialización parcial de plantillas
Se puede considerar la especialización parcial de plantillas como una forma de sobrecarga de plantillas. A continuación se presentan las reglas a seguir:
En la especialización parcial, se define una nueva versión de una función plantilla con algunos de sus parámetros fijados a tipos específicos, mientras que otros permanecen como genéricos. El compilador utiliza esta versión especializada siempre que encuentra tipos coincidentes durante la instanciación de la plantilla.
main.cpp
123456789101112131415#include <iostream> // Primary template template<typename T1, typename T2> bool IsSameType(T1 first, T2 second) { return false; } // Partial specialization for when both types are the same template<typename T> bool IsSameType(T first, T second) { return true; } int main() { std::cout << IsSameType(10, 'a') << std::endl; std::cout << IsSameType("Hello", "World") << std::endl; }
Esa es una forma de utilizar la especialización de plantillas, pero existe otro escenario más común.
main.cpp
123456789101112131415#include <iostream> // Primary template template <typename T1, typename T2> // General case void Template(T1 a, T2 b) { std::cout << "General" << std::endl; } // Partial specialization for when `T1` is `bool` template <typename T2> // Special case when the first type is `bool` void Template(bool a, T2 b) { std::cout << "Special" << std::endl; } int main() { Template(false, 25); Template(100, 300); }
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla