Encabezado de plantilla

En MQL5, puede hacer con plantillas las funciones, los tipos de objetos (clases, estructuras, uniones) o los métodos independientes de dentro de ellos. En cualquier caso, la descripción de la plantilla tiene un título:

template <typename T [, typename Ti ... ]>

El encabezado comienza con la palabra clave template, seguida de una lista separada por comas de parámetros formales entre corchetes angulares: cada parámetro se señala mediante la palabra clave typename y un identificador. Los identificadores deben ser únicos dentro de una definición concreta.

La palabra clave typename del encabezado de la plantilla le indica al compilador que el siguiente identificador debe tratarse como un tipo. En el futuro, es probable que el compilador de MQL5 admita otros tipos de parámetros que no sean de tipo, como hace el compilador de C++.

Este uso de typename no debe confundirse con el operador integrado typename, que devuelve una cadena con el nombre del tipo del argumento pasado.

Un encabezado de plantilla va seguido de una definición habitual de una función (método) o clase (estructura, unión), en la que los parámetros formales de la plantilla (identificadores T, Ti) se utilizan en instrucciones y expresiones en aquellos lugares en los que la sintaxis requiere un nombre de tipo. Por ejemplo, para las funciones de plantilla, los parámetros de plantilla describen los tipos de los parámetros de la función o el valor de retorno, y en una clase de plantilla, un parámetro de plantilla puede designar un tipo de campo.

Una plantilla es una definición completa. Una plantilla termina con la definición de una entidad (función, método, clase, estructura, unión) precedida del encabezamiento template.

Para los nombres de parámetros de plantilla, es habitual tomar identificadores de uno o dos caracteres en mayúsculas.

El número mínimo de parámetros es 1 y el máximo, 64.

Los principales casos de uso de los parámetros (utilizando el parámetro T como ejemplo) incluyen:

  • tipo al describir campos, variables locales en funciones/métodos, sus parámetros y valores de retorno (T variable_name; T function(T parameter_name));
  • uno de los componentes de un nombre de tipo totalmente cualificado, en concreto T::SubType, T.StaticMember;
  • construcción de nuevos tipos con modificadores: const T, puntero T *, referencia T &, matriz T[], funciones typedef T(*func)(T);
  • construcción de nuevos tipos de plantillas: T<Type>, Type<T>, incluso al heredar de plantillas (véase la sección Especialización de plantillas, que no está presente);
  • conversión de tipos (T) con la capacidad de añadir modificadores y crear objetos vía new T();
  • sizeof(T) como reemplazo primitivo para los parámetros de valor que están ausentes en las plantillas MQL (en el momento de escribir el libro).