D-programming-templates

提供:Dev Guides
移動先:案内検索

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