Dプログラミング-テンプレート
テンプレートはジェネリックプログラミングの基盤であり、特定のタイプに依存しない方法でコードを記述します。
テンプレートは、ジェネリッククラスまたは関数を作成するための青写真または式です。
テンプレートは、コンパイラがプログラムコードを自動的に生成するために、コードをパターンとして記述することを可能にする機能です。ソースコードの一部は、その部分が実際にプログラムで使用されるまで、コンパイラに入力してもらうことができます。コンパイラーは不足している部分を埋めます。
関数テンプレート
関数をテンプレートとして定義すると、関数が使用する1つ以上の型が未指定のままになり、後でコンパイラーによって推測されます。未指定のままになっているタイプは、関数の名前と関数パラメーターリストの間にあるテンプレートパラメーターリスト内で定義されます。そのため、関数テンプレートには2つのパラメータリストがあります-
- テンプレートパラメータリスト
- 機能パラメータ一覧
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