範本是泛型編程,涉及編寫代碼的方式,獨立於任何特定類型的基礎。
範本是藍圖或公式創建一個泛型類或函數。
範本的功能,允許描述的代碼作為一種模式,讓編譯器自動生成的程式代碼。的源代碼部分可留至要填充,直到該部分是在程式實際使用的編譯器。編譯器填補了缺失的部分。
函數範本:
定義一個函數作為範本離開一個或多個使用作為非特定的類型,可以由編譯器後面推導出來。正在未指定的類型範本形參表上,它的函數的名稱,函數參數列表之間進行定義。出於這個原因,函數範本有兩個參數列表:範本形參表和函數參數列表:
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