D/模板和泛型编程/模板函数初学者指南
外观
就像模板类允许编写通用数据结构一样,模板函数允许编写通用算法。一般来说,模板函数允许库编写者为参数类型编写函数,而无需用相同的代码重载该函数。
模板函数看起来像一个带有两组参数的普通函数
foo(T, U) (T t, U u)
{
}
第一组参数是模板参数。(有关允许作为模板参数的内容,请参阅有关模板类的部分。)第二组参数是普通的函数参数。
在上述示例中,该函数可以通过传递普通函数参数来调用。D 将根据参数的类型自动推导出模板参数。这称为 *隐式函数模板实例化*,简称 IFTI。
函数模板可以像任何其他模板一样显式实例化,例如foo!(int, char[])(12, "hello").
模板函数的经典示例是min函数
T min(T) (T t1, T t2)
{
if (t1 < t2) return t1;
else return t2;
}
此函数确定任何两个参数(类型相同)中哪个更小。(有一个愚蠢的警告,如果它们相等,它将返回第二个参数。)
min(12, 20); // Returns 12 min("green"[], "blue"); // Return "blue"
(关于第二个示例的说明。我们传递了min"green" 的一个切片,因为否则 D 会推断参数的类型为 char[5],一个静态数组。 "blue" 的类型是 char[4],一个不同的类型。通过对 "green" 进行切片,我们得到了一个 char[],一个动态数组,D 知道如何隐式转换为这种类型。)