跳转到内容

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 知道如何隐式转换为这种类型。)

华夏公益教科书