テンプレート

C++テンプレート では、 関連するクラスのセット、または関連する関数のセットについて記述し、その宣言のパラメーターのリストでは、 そのセットのメンバーが、どのように異なるかを記述します。 これらのパラメーターに引き数を提供すると、コンパイラーは、新規のクラスまたは関数を生成します。 このプロセスは、テンプレートのインスタンス化 と呼ばれます。 テンプレート、およびテンプレート・パラメーターのセットから生成されたこのクラスや関数定義は、 特殊化 と呼ばれます。

構文 - テンプレート宣言
 
>>-+--------+--------------------------------------------------->
   '-export-'
 
>--template--<--template_parameter_list-->--declaration--------><
 
 

コンパイラーは、テンプレートで export キーワードを受諾し、暗黙に無視します。

template_parameter_list は、 次に示す種類のテンプレート・パラメーターをコンマで区切ったリストです。

declaration は、次のいずれかです。

typeidentifier は、テンプレート宣言のスコープ内の type_name になるように定義します。テンプレート宣言は、ネーム・スペース・スコープ宣言 またはクラス・スコープ宣言として現れます。

次の例は、クラス・テンプレートの使用法を示しています。

template<class L> class Key
{
    L k;
    L* kptr;
    int length;
public:
    Key(L);
    // ...
};

その後、次の宣言が現れるとします。

Key<int> i;
Key<char*> c;
Key<mytype> m;

コンパイラーは、3 つのオブジェクトを作成します。 次の表は、3 つのオブジェクトが、 ソース・コードの書式で、テンプレートとしてではなく通常のクラスとして書き出された場合の、 それらオブジェクトの定義を示しています。

class Key<int> i; class Key<char*> c; class Key<mytype> m;
class Key
{
      int k;
      int * kptr;
      int length;
public:
      Key(int);
      // ...
};
class Key
{
      char* k;
      char** kptr;
      int length;
public:
      Key(char*);
      // ...
};
class Key
{
      mytype k;
      mytype* kptr;
      int length;
public:
      Key(mytype);
      // ...
};

これらの 3 つのクラスには、それぞれ名前があることに注意してください。 不等号括弧の中に含まれている引き数は、単にクラス名に対する引き数ではなく、 クラス名自体の一部です。 Key<int>Key<char*> は、クラス名です。

関連参照

IBM Copyright 2003