テンプレートは、コードを書くの任意の特定の種類に依存しない方法でジェネリックプログラミング、ジェネリックプログラミングの基本です。 テンプレート機能は、一般的なクラスや設計図や式を作成することです。例えば図書館のコンテナ、反復子、およびアルゴリズムは、ジェネリックプログラミングの例であり、彼らはすべてのテンプレートの概念を使用します。 各容器は、そのようなベクターとして単一の定義を有し、それは、このようなベクターのようなベクターの多くの異なるタイプで定義することができる < 整数 >またはVector < 文字列 >。
一般的な形式のテンプレート関数に示すように、以下のように定義される: テンプレート < クラスタイプ> func- RET型名(パラメータリスト) { // メイン関数を } ここで、タイプ、名前プレースホルダー機能によって使用されるデータタイプです。名前は、関数定義で使用することができます。
書式#include <iostreamの> の#include < 文字列 > 使用して名前空間はstdを、 テンプレート <型名T> インラインT のconst&MAX(TのCONSTと、TのCONST&B) { 戻り <bは?B:; } int型のmain() { int型私は= 39 。 int型 J = 20 ; 裁判所未満 << " マックス(i、j)は:" <<マックス(i、j)は<< てendl; ダブル F1 = 13.5 ; ダブル F2 = 20.7 ; 裁判所未満 << " マックス(F1、F2):" <<マックス(F1、F2)<< てendl; 文字列 S1 = " こんにちは" ; 文字列 s2を= " 世界" ; COUT << " マックス(S1、S2):" <<マックス(S1、S2)<< ENDL。 リターン 0 ; }
クラステンプレートの定義。次のようにジェネリッククラス宣言の一般的な形式は: テンプレート < クラスタイプ> クラスの クラス - {名 。 。 。 } ここで、タイプは、クラスがインスタンス化されるときに指定することができ、プレースホルダ・タイプ名です。カンマ区切りのリストは、一般的なデータタイプの複数を定義するために使用することができます。
次の例は、> <クラススタックを定義し、スタックポップ操作の要素を実装する一般的な方法 の#include <iostreamの> する#include <ベクトル> の#include <cstdlib> の#include < ストリング > の#include <stdexcept提供> 使用して名前空間STD; テンプレート < クラス T> クラススタック{ プライベート: ベクトル <T> elems; // 要素の公共: ボイドプッシュ(T のconst&); // スタックボイド POP(); // スタック 上部T()のconst ; // トップ要素戻り BOOL空()CONSTを { // そうである場合、それは真を返し空にする。 戻りelems.empty(); } }; テンプレート < クラス T> ボイドスタック<T> ::プッシュ(T CONST&ELEM) { // 受信素子の追記コピー elems.push_back(ELEM); } テンプレート < クラス T > 空スタック<T> :: POP() { IF (elems.empty()){ スロー out_of_range("スタック<> :: POP():スタックが空" ); } // 最後の要素の削除 elems.pop_backを(); } テンプレート < クラス T> Tスタック <T> ::トップ()のconst { IF (elems.empty ()){ スロー out_of_range(" スタック<> ::トップ():スタックが空" ); } //は、最後の要素のコピーを返す 戻りelems.backを(); } int型のmain() { 試み{ スタック < int型 > IntStack; //int型スタック スタック< ストリング > STRINGSTACK; // 文字列型スタック // タイプの動作INTスタック intStack.push(7。); COUT << intStack.top()<< ENDL; // 操作型ストリングスタック STRINGSTACK .push(" こんにちは" ); COUT << stringStack.top()<< STD :: ENDL; stringStack.pop(); stringStack.pop(); } キャッチ(例外CONST&EX){ CERR、 << " 例外:"<< ex.what()<< ENDL。 リターン - 1 。 } }