- D 程式設計基礎
- D 程式設計 - 首頁
- D 程式設計 - 概述
- D 程式設計 - 環境
- D 程式設計 - 基本語法
- D 程式設計 - 變數
- D 程式設計 - 資料型別
- D 程式設計 - 列舉
- D 程式設計 - 字面量
- D 程式設計 - 運算子
- D 程式設計 - 迴圈
- D 程式設計 - 條件語句
- D 程式設計 - 函式
- D 程式設計 - 字元
- D 程式設計 - 字串
- D 程式設計 - 陣列
- D 程式設計 - 關聯陣列
- D 程式設計 - 指標
- D 程式設計 - 元組
- D 程式設計 - 結構體
- D 程式設計 - 聯合體
- D 程式設計 - 範圍
- D 程式設計 - 別名
- D 程式設計 - 混入
- D 程式設計 - 模組
- D 程式設計 - 模板
- D 程式設計 - 不可變物件
- D 程式設計 - 檔案 I/O
- D 程式設計 - 併發
- D 程式設計 - 異常處理
- D 程式設計 - 合約
- D - 條件編譯
- D 程式設計 - 面向物件
- D 程式設計 - 類與物件
- D 程式設計 - 繼承
- D 程式設計 - 過載
- D 程式設計 - 封裝
- D 程式設計 - 介面
- D 程式設計 - 抽象類
- D 程式設計 - 有用資源
- D 程式設計 - 快速指南
- D 程式設計 - 有用資源
- D 程式設計 - 討論
D 程式設計 - 模板
模板是泛型程式設計的基礎,泛型程式設計是指編寫獨立於任何特定型別的程式碼。
模板是建立泛型類或函式的藍圖或公式。
模板允許將程式碼描述為模式,編譯器會自動生成程式程式碼。部分原始碼可以留給編譯器填充,直到該部分實際用於程式中。編譯器會填充缺失的部分。
函式模板
將函式定義為模板意味著將它使用的一個或多個型別留為空白,以便編譯器稍後推斷。這些未指定的型別在模板引數列表中定義,該列表位於函式名稱和函式引數列表之間。因此,函式模板有兩個引數列表:
- 模板引數列表
- 函式引數列表
import std.stdio;
void print(T)(T value) {
writefln("%s", value);
}
void main() {
print(42);
print(1.2);
print("test");
}
如果我們編譯並執行上面的程式碼,將會產生以下結果:
42 1.2 test
具有多個型別引數的函式模板
可以有多個引數型別。以下示例中展示了這一點。
import std.stdio;
void print(T1, T2)(T1 value1, T2 value2) {
writefln(" %s %s", value1, value2);
}
void main() {
print(42, "Test");
print(1.2, 33);
}
如果我們編譯並執行上面的程式碼,將會產生以下結果:
42 Test 1.2 33
類模板
就像我們可以定義函式模板一樣,我們也可以定義類模板。以下示例定義了類 Stack 並實現了泛型方法來壓入和彈出堆疊中的元素。
import std.stdio;
import std.string;
class Stack(T) {
private:
T[] elements;
public:
void push(T element) {
elements ~= element;
}
void pop() {
--elements.length;
}
T top() const @property {
return elements[$ - 1];
}
size_t length() const @property {
return elements.length;
}
}
void main() {
auto stack = new Stack!string;
stack.push("Test1");
stack.push("Test2");
writeln(stack.top);
writeln(stack.length);
stack.pop;
writeln(stack.top);
writeln(stack.length);
}
當編譯並執行上述程式碼時,會產生以下結果:
Test2 2 Test1 1
廣告