Заголовок шаблона
Шаблонными в 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-шаблонах (на момент написания книги).