Programowanie D - szablony

Szablony są podstawą programowania ogólnego, które obejmuje pisanie kodu w sposób niezależny od określonego typu.

Szablon to plan lub formuła tworzenia ogólnej klasy lub funkcji.

Szablony to funkcja, która pozwala opisywać kod jako wzorzec dla kompilatora do automatycznego generowania kodu programu. Części kodu źródłowego można pozostawić kompilatorowi do wypełnienia, dopóki ta część nie zostanie faktycznie wykorzystana w programie. Kompilator uzupełnia brakujące części.

Szablon funkcji

Definiowanie funkcji jako szablonu pozostawia jeden lub więcej typów, których używa, jako nieokreślonych, aby kompilator mógł je później wywnioskować. Nieokreślone typy są definiowane w ramach listy parametrów szablonu, która znajduje się między nazwą funkcji a listą parametrów funkcji. Z tego powodu szablony funkcji mają dwie listy parametrów -

  • lista parametrów szablonu
  • lista parametrów funkcji
import std.stdio; 
 
void print(T)(T value) { 
   writefln("%s", value); 
}
  
void main() { 
   print(42);  
   
   print(1.2);
   
   print("test"); 
}

Jeśli skompilujemy i uruchomimy powyższy kod, dałoby to następujący wynik -

42 
1.2 
test

Szablon funkcji z wieloma parametrami typu

Może istnieć wiele typów parametrów. Przedstawiono je w poniższym przykładzie.

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); 
}

Jeśli skompilujemy i uruchomimy powyższy kod, dałoby to następujący wynik -

42 Test 
 1.2 33

Szablony klas

Tak jak możemy definiować szablony funkcji, możemy również definiować szablony klas. Poniższy przykład definiuje klasę Stack i implementuje metody ogólne do wypychania i zdejmowania elementów ze stosu.

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); 
}

Kiedy powyższy kod jest kompilowany i wykonywany, daje następujący wynik -

Test2 
2 
Test1 
1