1. 重载函数与函数模板
在编程中,我们经常使用重载函数来对不同的数据类型执行类似的操作。例如,在MQL4中,ArraySize()
函数可以返回任何类型数组的大小。但对于MQL4应用程序开发者来说,重载函数的整个实现是隐藏的。
为了简化重载函数的应用,我们可以使用函数模板。通过使用函数模板,程序员只需要写一个函数模板描述,而不必为每种数据类型重复写重载函数。函数模板的定义以template
关键字开始,后跟尖括号内的形式参数列表。
例如,我们可以定义一个函数模板来查找任意数字类型数组中的最大值:
template<typename T>
T ArrayMax(T &arr[])
{
uint size=ArraySize(arr);
if(size==0) return(0);
T max=arr[0];
for(uint n=1;n<size;n++)
if(max<arr[n]) max=arr[n];
return(max);
}
2. 使用函数模板简化操作
考虑一个常见任务:查找数组中的最大值。在MQL4中,ArrayMaximum()
函数返回最大值的索引,我们还需要额外步骤来找到该值。
使用上面的ArrayMax()
函数模板,我们可以简化这个过程:
double max=ArrayMax(array);
3. 获得数据类型名称
我们可以使用typename
关键字来获取函数参数的类型作为字符串,以创建通用的处理多种数据类型的方法:
template<typename T>
string GetTypeName(const T &t)
{
return(typename(T));
}
4. 函数模板在类方法中的应用
函数模板不仅限于常规函数,它们还可以用于类方法:
class CFile
{
...
public:
template<typename T>
uint WriteStruct(T &data);
};
5. 模板函数重载
有时,我们可能需要对模板函数进行重载。例如,MQL5不允许将字符串类型转换为bool类型。为此,我们可以创建一个模板函数的重载版本:
template<typename T1,typename T2>
string Assign(T1 &var1,T2 var2)
{
var1=(T1)var2;
return(__FUNCSIG__);
}
总的来说,函数模板为MQL4程序员提供了一个强大而灵活的工具,用于简化代码并提高代码的可重用性。