C++クラステンプレート(テンプレートクラス)詳細


人々は複数の形式と機能が似ている関数を書く必要があるため、関数テンプレートが重複労働を減らす.多くの形式と機能が似ているクラスを作成する必要があるため、C++はクラステンプレートの概念を引き起こし、コンパイラはクラステンプレートから複数のクラスを自動的に生成することができ、プログラマーの重複労働を避けることができる.たとえば、「C++演算子リロード」の章の「C++可変長を実現する動的配列」の節では、可変長の整数配列クラスを実現し、可変長のdouble配列クラス、可変長のCStudent配列クラスなどが必要になる可能性があります.可変長配列クラスに似たコードを書き換えるのは面倒に違いない.クラステンプレートのメカニズムがあり、可変長の配列クラステンプレートを書くだけで、コンパイラはこのクラステンプレートから自動的に整数型、double型などの様々なタイプの可変長配列クラスを生成します.C++のクラステンプレートの書き方は以下の通りです.
template classクラステンプレート名{メンバー関数とメンバー変数};
タイプパラメータテーブルの書き方は以下の通りです.
class系塑性パラメータ1,class型パラメータ2,...
クラステンプレートのメンバー関数をクラステンプレート定義の外部に配置するときの構文は、次のとおりです.
template戻り値タイプクラステンプレート名::メンバー関数名(パラメータテーブル){...}
クラステンプレートでオブジェクトを定義する書き方は、次のとおりです.
クラステンプレート名オブジェクト名(コンストラクション関数の実際のパラメータテーブル);
クラステンプレートにコンストラクション関数の有無については、次のように書くこともできます.
クラステンプレート名オブジェクト名;
クラステンプレートはクラスのように見えます.次に、Pairクラステンプレートを例にクラステンプレートの書き方と使い方を説明します.実際には、あるデータレコードは2つの部分からなり、一部はキーワードであり、もう一部は値であることがよくあります.キーワードはレコードのソートと取得に使用され、キーワードに基づいて値を調べることができます.例えば、学生記録は2つの部分から構成され、一部は学号であり、もう一部は成績点である.成績点を容易に検索できるように、学号に基づいて学生をソートできるようにするには、学号がキーワードであり、成績点が値である.次のPairクラステンプレートは、このようなデータレコードを処理するために使用できます.
#include 
#include 
using namespace std;

template 
class Pair
{
public:
T1 key; //   
T2 value; // 
Pair(T1 k,T2 v):key(k),value(v) { };
bool operator < (const Pair & p) const;
};

template
bool Pair::operator < (const Pair & p) const
//Pair      operator <
{ //" "         
return key < p.key;
}

int main()
{
Pair student("Tom",19); //        Pair
cout << student.key << " " << student.value;
return 0;
}

プログラムの出力結果は、Tom 19がクラステンプレートをインスタンス化した場合、21行目のように、実際のタイプパラメータテーブルのパラメータはstring、intまたはCStudentなどの特定のタイプ名であり、クラステンプレート定義のタイプパラメータテーブルのタイプパラメータを1つ1つ対応して置き換えるために使用される. は具体的なクラスの名前になります.コンパイラが21行目にコンパイルすると、PairテンプレートのT 1をstringで置き換え、T 2をintで置き換え、残りの部分をそのまま残すことで、自動的に新しいクラスが生成されます.このクラスの名前コンパイラがどのように処理されているかは知る必要はなく,その名前がPairであると考えられる.つまりstudentオブジェクトのタイプがPairであるといえる.Pairクラスのメンバ関数も当然,Pairテンプレートのメンバ関数のT 1,T 2を置き換えることで得られる.コンパイラがクラステンプレートからクラスを生成するプロセスをクラステンプレートのインスタンス化と呼ぶ.クラステンプレートをインスタンス化したクラスをテンプレートクラスと呼ぶ.
クラステンプレートのメンバーとしての関数テンプレート
クラステンプレートのメンバー関数は、関数テンプレートであってもよい.メンバー関数テンプレートは、呼び出されたときにのみインスタンス化されます.たとえば、次のプログラムがあります.
 
  • #include
  • using namespace std;
  • template
  • class A
  • {
  • public:
  • template
  • void Func(T2 t) { cout << t; }//メンバー関数テンプレート
  • };
  • int main()
  • {
  • A a;
  • a.Func('K');//メンバー関数テンプレートFuncがインスタンス化された
  • a.Func("hello");
  • return 0;
  • }

  • プログラムの出力結果は:Khello