模板头部
在 MQL5 中,您可以将函数、对象类型(类、结构体、联合体)或其中的单独方法模板化。无论如何,模板说明都有一个标题:
template <typename T [, typename Ti ... ]> |
头部以 template 关键字开头,后面是用逗号分隔的形式参数列表,这些参数都放在尖括号中:每个参数都用 typename 关键字和标识符表示。标识符在特定定义中必须是唯一的。
模板头部中的 typename 关键字会告知编译器,下面的标识符应被视为一种类型。将来,MQL5 编译器可能会像 C++ 编译器一样,支持其他类型的非类型参数。
请勿将 typename 的这种用法不应与内置的 运算符typename混淆,后者返回的字符串包含所传递参数的类型名称。
模板头部之后是函数(方法)或类(结构体、联合体)的常规定义,在常规定义中,在语法要求类型名称的位置,模板的形式参数(标识符 T、Ti)被用于指令和表达式。例如,对于模板函数,模板参数描述函数参数或返回值的类型,而在模板类中,模板参数可以指定字段类型。
模板是一个完整的定义。模板的结尾是实体(函数、方法、类、结构体、联合体)的定义,前面加上 template 标题。
对于模板参数名,习惯上使用大写的单字符或双字符标识符。
参数的最小数量为 1,最大数量为 64。
参数的主要用例(以 T 参数为例)包括:
- 类型,在描述字段、函数/方法中的局部变量、其参数和返回值时使用(T variable_name;T function(T parameter_name));
- 完全限定类型名称的组成部分之一,具体而言是:T::SubType、T.StaticMember;
- 使用修饰符构造新类型:const T、指针 T *、引用 T &、数组 T[]、typedef 函数 T(*func)(T);
- 构造新模板类型:T<Type>、Type<T>,包括从模板继承时(请参见 不存在的模板特化一节);
- 类型转换 (T),能够添加修饰符,并通过 new T() 创建对象;
- sizeof(T) 作为 MQL 模板中不存在的值参数的原始替代(截止本书撰写时有效)。