- Encabezado de plantilla
- Principios generales de funcionamiento de la plantilla
- Plantillas frente a macros de preprocesador
- Características de tipos integrados y objetos en plantillas
- Plantillas de funciones
- Plantillas de tipos de objetos
- Plantillas de métodos
- Plantillas anidadas
- Ausencia de especialización de plantillas
Ausencia de especialización de plantillas
En algunos casos, puede ser necesario proporcionar una implementación de plantilla para un tipo particular (o conjunto de tipos) de forma que difiera de la genérica. Por ejemplo, suele tener sentido preparar una versión especial de la función swap para punteros o arrays. En tales casos, C++ permite realizar lo que se denomina especialización de plantilla, es decir, definir una versión de la plantilla en la que el parámetro de tipo genérico T se sustituye por el tipo concreto requerido.
A la hora de especializar plantillas de funciones y métodos, deben especificarse tipos concretos para todos los parámetros. Esto se denomina especialización completa.
En el caso de las plantillas de tipos de objetos de C++, la especialización puede ser no sólo completa, sino también parcial: especifica el tipo de sólo algunos de los parámetros (y el resto se inferirá o especificará cuando se creen instancias de la plantilla). Puede haber varias especializaciones parciales: la única condición para ello es que cada especialización describa una combinación única de tipos.
Por desgracia, en MQL5 no existe la especialización en el sentido estricto de la palabra.
La especialización de funciones de plantilla no es diferente de la sobrecarga. Por ejemplo, dada la siguiente plantilla func:
template<typename T>
|
está permitido proporcionar su implementación personalizada para un tipo determinado (como string) en uno de los formularios:
// explicit specialization
|
o bien,
// normal overload
|
Sólo debe seleccionarse uno de los formularios. De lo contrario, obtendremos un error de compilación «'func' - la función ya se ha definido y tiene cuerpo».
En cuanto a la especialización de las clases, la herencia a partir de plantillas con indicación de tipos específicos para algunos de los parámetros de la plantilla puede considerarse equivalente a su especialización parcial. Los métodos de plantilla se pueden sobrescribir (overridden) en una clase derivada.
En el siguiente ejemplo (TemplatesExtended.mq5) se muestran varias opciones para utilizar parámetros de plantilla como tipos padre, incluidos casos en los que uno de ellos se explicita como específico.
#define RTTI Print(typename(this))
|
Proporcionaremos una creación de instancia de un objeto según una plantilla utilizando una variable:
Derived2<Derived1<Base>> derived2; |
El registro de tipo de depuración utilizando la macro RTTI produce el siguiente resultado:
Base
|
Cuando se desarrollan bibliotecas que vienen como binarios cerrados, debe asegurarse de que se crean explícitamente instancias de plantillas para todos los tipos con los que se espera que trabajen los futuros usuarios de la biblioteca. Puede hacer esto llamando explícitamente a plantillas de funciones y creando objetos con parámetros de tipo en alguna función auxiliar, por ejemplo, ligada a la inicialización de una variable global.