跳轉到內容

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

華夏公益教科書