トップC++入門 > テンプレート
テンプレート

1.テンプレート

テンプレートは、プログラマが一度コードを書くだけで、 そのコードが広範囲の型に適用できるようにすることである。 テンプレートには関数テンプレートとクラステンプレートがある。

2.関数テンプレート

関数テンプレートは、引数または戻り値の型だけが異なった、関連する複数の関数を記述したものである。 下に例を示す。

  template <class Number> Number twice(Number original) { return original + original; }
  double twicedouble(double item) { return twice(item); }
  int twiceint(int item) { return twice(item); }

3.クラス・テンプレート

クラステンプレートは、複数の関連するクラスを記述する。

クラステンプレートの宣言

クラステンプレートの宣言では、クラスの名前とそのテンプレート引数だけを指定する。

下に、任意の型の引数を取る Array というクラス、および unsigned integer の引数を取る String というクラス に対するテンプレート宣言を示す。

  template <class Elem> class Array;
  template <unsigned Size> class String;

クラステンプレートの定義

クラステンプレートの定義では、次の例のようにクラスデータと関数メンバーを宣言する。

template <class Elem> class Array {
        Elem* data;
        int size;
    public:
        Array(int sz);
        int GetSize();
        Elem& operator[](int idx);
};

template <unsigned Size> class String {
        char data[Size];
        static int overflows;
    public:
        String(char *initial);
        int length();
};

関数テンプレートとは違って、クラステンプレートには class Elem のような型パラメータと unsigned Size のような式パラメータの両方を指定できる。

式パラメータには次の情報を指定できる。

クラステンプレートメンバーの定義

次の例は、Array クラステンプレートの関数メンバーの定義を示す。
 template <class Elem> Array<Elem>::Array(int sz)
    { size = sz; data = new Elem[size]; }

 template <class Elem> int Array<Elem>::GetSize( )
    { return size; }
次の例は、String クラステンプレートの関数メンバーおよび静的データメンバーの定義を示す。
 #include <string.h>
 template <unsigned Size> int String<Size>::length( )
    { int len = 0;
      while (len < Size && data[len] != '\0') len++;
      return len; }

 template <unsigned Size> String<Size>::String(char *inital)
    { strncpy(data, initial, Size);
      if (length( ) == Size) overflow++; }

 template <unsigned Size> int String<Size>::overflows = 0;

クラステンプレートの使用

テンプレートクラスを指定するには、テンプレート名と引数の値を設定する。 次の宣言例では、Array テンプレートに基づいた変数 int_array を作成する。

 Array<int> int_array(100);
次の宣言例は、String テンプレートを使用して short_string 変数を作成する。
 String<8> short_string("hello");
テンプレートクラスのメンバー関数は、他のすべてのメンバー関数と同じように使用できる。
 int x = int_array.GetSize( );
 int x = short_string.length( );

A.リファレンス

[1] C++ プログラミングガイド > 第 4 章 テンプレート