Заголовок шаблона

Шаблонными в MQL5 можно сделать функции, объектные типы (классы, структуры, объединения) или отдельные методы внутри них. В любом случае описание шаблона имеет заголовок:

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

Заголовок начинается с ключевого слова template, за которым в угловых скобках, через запятую перечисляются формальные параметры: каждый параметр обозначается ключевым словом typename и идентификатором. Идентификаторы должны быть уникальными внутри конкретного определения.

Ключевое слово typename в заголовке шаблона сообщает компилятору, что идущий следом идентификатор следует рассматривать как заместитель типа. В будущем компилятор MQL5, вероятно, поддержит другие виды параметров, не являющихся типами, как это делает компилятор C++.

Не следует путать данное применение typename и встроенный оператор typename, возвращающий строку с названием типа переданного аргумента.

После заголовка шаблона следует привычное определение функции (метода) или класса (структуры, объединения), в котором формальные параметры шаблона (идентификаторы T, Ti) используются в инструкциях и выражениях в тех местах, где синтаксис требует наличия названия типа. Например, для шаблонных функций параметры шаблона описывают типы параметров функции или возвращаемого значения, а в шаблонном классе параметр шаблона может обозначать тип поля.

Шаблоном является всё определение целиком. Шаблон заканчивается вместе с определением сущности (функции, метода, класса, структуры, объединения), перед которой был заголовок template.

Для имен параметров шаблонов принято брать одно- или двухсимвольные идентификаторы в верхнем регистре.

Минимальное количество параметров — 1, максимальное — 64.

Основные варианты использования параметров (на примере параметра T) включают:

  • тип при описании полей, локальных переменных в функциях/методах, их параметров и возвращаемых значений (T имя_переменной; T функция(T имя_параметра));
  • одна из составляющих полностью квалифицированного имени типа, в частности: T::SubType, T.StaticMember;
  • конструирование новых типов с модификаторами: const T, указатель T *, ссылка T &, массив T[], typedef функции T(*func)(T);
  • конструирование новых шаблонных типов: T<Type>, Type<T>, в том числе и при наследовании от шаблонов (см. раздел Специализация шаблонов, которой нет);
  • приведение типов (T) с возможностью добавления модификаторов и создание объектов через new T();
  • sizeof(T), как примитивная замена параметрам-значениям, отсутствующим в MQL-шаблонах (на момент написания книги).