模板头部

在 MQL5 中,您可以将函数、对象类型(类、结构体、联合体)或其中的单独方法模板化。无论如何,模板说明都有一个标题:

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

头部以 template 关键字开头,后面是用逗号分隔的形式参数列表,这些参数都放在尖括号中:每个参数都用 typename 关键字和标识符表示。标识符在特定定义中必须是唯一的。

模板头部中的 typename 关键字会告知编译器,下面的标识符应被视为一种类型。将来,MQL5 编译器可能会像 C++ 编译器一样,支持其他类型的非类型参数。

请勿将 typename 的这种用法不应与内置的 运算符typename混淆,后者返回的字符串包含所传递参数的类型名称。

模板头部之后是函数(方法)或类(结构体、联合体)的常规定义,在常规定义中,在语法要求类型名称的位置,模板的形式参数(标识符 T、Ti)被用于指令和表达式。例如,对于模板函数,模板参数描述函数参数或返回值的类型,而在模板类中,模板参数可以指定字段类型。

模板是一个完整的定义。模板的结尾是实体(函数、方法、类、结构体、联合体)的定义,前面加上 template 标题。

对于模板参数名,习惯上使用大写的单字符或双字符标识符。

参数的最小数量为 1,最大数量为 64。

参数的主要用例(以 T 参数为例)包括:

  • 类型,在描述字段、函数/方法中的局部变量、其参数和返回值时使用(T variable_nameT function(T parameter_name));
  • 完全限定类型名称的组成部分之一,具体而言是:T::SubTypeT.StaticMember
  • 使用修饰符构造新类型:const T、指针 T *、引用 T &、数组 T[]typedef 函数 T(*func)(T)
  • 构造新模板类型:T<Type>Type<T>,包括从模板继承时(请参见 不存在的模板特化一节);
  • 类型转换 (T),能够添加修饰符,并通过 new T() 创建对象;
  • sizeof(T) 作为 MQL 模板中不存在的值参数的原始替代(截止本书撰写时有效)。