c++テンプレート入門、汎用プログラミング、関数テンプレート、クラステンプレート


目次
 
1.汎用プログラミング
2.関数テンプレート
2.1関数テンプレートの概念
2.2関数テンプレート形式
2.3関数テンプレートの原理
2.4関数テンプレートのインスタンス化
2.5テンプレートパラメータの整合原則
3.クラステンプレート
3.1クラステンプレートの定義形式
3.2クラステンプレートのインスタンス化
1.汎用プログラミング
共通の交換関数をどのように実現しますか?
関数リロードを使用すると実現できますが、いくつかの悪い点があります.
1.リロードされた関数はタイプが異なるだけで、コードの多重化率が低いので、新しいタイプが現れると、対応する関数を増やす必要がある
2.コードの保守性が低く、1つのエラーですべてのリロードがエラーになる可能性があります.
汎用プログラミング:タイプに関係のない汎用コードを記述することは、コード多重化の手段である.テンプレートは汎用プログラミングの基礎です.
 
2.関数テンプレート
2.1関数テンプレートの概念
関数テンプレートは、タイプに関係なくパラメータ化され、実パラメータタイプに基づいて関数の特定のタイプバージョンを生成する関数ファミリーを表します.
2.2関数テンプレート形式
template
戻り値タイプ関数名(パラメータリスト){}
template
void Swap( T& left, T& right) { T temp = left;
left = right;
right = temp; }

注意:typenameはテンプレートパラメータを定義するためのキーワードであり、classを使用することもできます(classの代わりにstructを使用することはできません)
2.3関数テンプレートの原理
コンパイラコンパイルフェーズでは、テンプレート関数の使用について、コンパイラは、呼び出しのために、入力された実パラメータタイプに基づいて、対応するタイプの関数を推論して生成する必要があります.たとえば、doubleタイプで関数テンプレートを使用する場合、コンパイラは実パラメータタイプを推論することによってTをdoubleタイプと決定し、文字タイプについてもdoubleタイプを専門に処理するコードを生成します.
2.4関数テンプレートのインスタンス化
異なるタイプのパラメータで関数テンプレートを使用する場合、関数テンプレートのインスタンス化と呼ばれます.テンプレートパラメータのインスタンス化は、暗黙的インスタンス化と明示的インスタンス化に分けられます.
1.暗黙的なインスタンス化:コンパイラにテンプレートパラメータの実際のタイプを実参に基づいて推論させる
2.明示的なインスタンス化:関数名の後の<>でテンプレートパラメータの実際のタイプを指定します.
タイプが一致しない場合、コンパイラは暗黙的なタイプ変換を試み、変換に成功しない場合はエラーが表示されます.
2.5テンプレートパラメータの整合原則
1.非テンプレート関数は、同じ名前の関数テンプレートと同時に存在することができ、この非テンプレート関数としてインスタンス化することもできる
2.非テンプレート関数および同じ名前の関数テンプレートの場合、他の条件が同じである場合、テンプレートからインスタンスを生成することなく、異動時に非テンプレート関数が優先的に呼び出されます.テンプレートがよりよく一致する関数を生成できる場合は、テンプレートを選択します.
3.テンプレート関数では自動型変換は許可されていませんが、通常の関数では自動型変換が可能です
 
3.クラステンプレート
3.1クラステンプレートの定義形式
template
class     
{
//       
};

3.2クラステンプレートのインスタンス化
クラステンプレートのインスタンス化は関数テンプレートのインスタンス化とは異なり、クラステンプレートのインスタンス化にはクラステンプレート名の後に<>を付け、インスタンス化のタイプを<>に置く必要があります.クラステンプレート名は本当のクラスではなく、インスタンス化の結果こそ本当のクラスです.
// Vector  ,Vector    
Vector s1;
s1.PushBack(1);
s1.PushBack(2);
s1.PushBack(3);
Vector s2;
s2.PushBack(1.0);
s2.PushBack(2.0);
s2.PushBack(3.0);
for(size_t i = 0; i < s1.Size(); ++i) {
cout<