Шаблоны являются основой общего программирования, которое включает в себя написание кода способом, независимым от какого-либо конкретного типа.
Шаблон — это план или формула для создания универсального класса или функции.
Шаблоны — это функция, которая позволяет описывать код как шаблон, чтобы компилятор автоматически генерировал программный код. Части исходного кода могут быть оставлены для заполнения компилятором до тех пор, пока эта часть не будет фактически использована в программе. Компилятор заполняет недостающие части.
Шаблон функции
Определение функции в качестве шаблона оставляет один или несколько типов, которые она использует, как неопределенные, которые будут выведены позднее компилятором. Типы, которые остаются неопределенными, определяются в списке параметров шаблона, который находится между именем функции и списком параметров функции. По этой причине шаблоны функций имеют два списка параметров:
- список параметров шаблона
- список параметров функции
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); }
Когда приведенный выше код компилируется и выполняется, он дает следующий результат —