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 知道如何隱式轉換為這種型別。)