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 
廣告
© . All rights reserved.