テンプレート では、
関連するクラスのセット、または関連する関数のセットについて記述し、その宣言のパラメーターのリストでは、
そのセットのメンバーが、どのように異なるかを記述します。
これらのパラメーターに引き数を提供すると、コンパイラーは、新規のクラスまたは関数を生成します。
このプロセスは、テンプレートのインスタンス化 と呼ばれます。
テンプレート、およびテンプレート・パラメーターのセットから生成されたこのクラスや関数定義は、
特殊化 と呼ばれます。
構文 - テンプレート宣言 >>-+--------+---------------------------------------------------> '-export-' >--template--<--template_parameter_list-->--declaration--------><
コンパイラーは、テンプレートで export キーワードを受諾し、暗黙に無視します。
template_parameter_list は、 次に示す種類のテンプレート・パラメーターをコンマで区切ったリストです。
declaration は、次のいずれかです。
type の identifier は、テンプレート宣言のスコープ内の 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*> は、クラス名です。
関連参照