組み込みオブジェクト向けプログラム開発・C++テンプレート


第十三課、C++テンプレート
概要
テンプレートはパラメータ化されたマルチステートツールです.パラメトリックマルチステートとは、プログラムが処理するオブジェクトのタイプをパラメトリック化し、複数の異なるタイプのオブジェクトを処理するためにプログラムコードを使用できるようにすることである.テンプレートプログラミングを採用することで、様々な論理機能が同じで、データ型が異なるプログラムにコード共有のメカニズムを提供することができる.
一、関数テンプレート
1、関数テンプレート:
(1)一般説明形式:
template
戻り値タイプ関数名(テンプレート関数パラメータテーブル)
{
//関数定義体
}
注意:1関数テンプレートの定義はキーワードtemplateで始まる
②template以降<>は関数テンプレートのパラメータリスト
③関数テンプレートのパラメータはタイプパラメータであり、そのタイプはclassまたはtypenameである
(2)構文:
1テンプレートパラメータは、テンプレート内で一種のタイプとして使用され、関数パラメータ、関数戻り値、関数局所変数に使用することができる.
2各テンプレートパラメータは、関数のパラメータリストに少なくとも1回表示されます.
3テンプレートパラメータ名の役割ドメインは関数テンプレートの範囲内に限られる.
④関数テンプレートには、タイプテンプレートパラメータ、非タイプテンプレートパラメータがあります.
2、関数テンプレートの例:
//タイプテンプレートパラメータ:TX
//非タイプテンプレートパラメータ:num
template
void print(const T &t, const X &x)
{
//X temp;
//cin >> temp;
     cout << t << endl;
     cout << x << endl;
     cout << num << endl;
}
 
int main()
{
……
     print(1,"hello");
//<>明示的な呼び出しがあり、なければ暗黙的
//暗黙呼び出し:コンパイラ自動推理パラメータタイプ;呼び出しの表示:使用時にパラメータタイプを指定する
……
}
3、テンプレートは2回コンパイルされます.
(1)モジュール関数をインスタンス化する前に、関数テンプレートの構文問題をコンパイルしてチェックする.
(2)モジュール関数をインスタンス化した後,コンパイルしてテンプレート関数の構文問題を調べる.
 
4、応用--コード機能の多重化を実現する:(出力最大値を例に)
(1)関数のリロード:関数のバージョンが多く、後期のメンテナンスが面倒で、コード体系が膨大すぎる.
int max(int a, int b){return a > b ? a : b;}
int max(string a, string b){ return a > b ? a : b;}
int max(A a, B b){ return a > b ? a : b;}
(2)マクロ関数:安全ではなく,タイプチェックをせず,バカな置換のみを行い,複雑すぎる関数を実現するのに適していない.
#define MAX(a,b) a > b ? a : b 
(3)テンプレート:関数のリロードバージョンが多すぎて、マクロ関数が安全ではなく、複雑な関数に適していないという問題を解決しました.
template
T MyMax(const T &a, const T &b)
{
     return a > b ? a : b;//三目演算子:最終最大数を返す
}
int main()
{
……
cout << MyMax(5,6) << endl; 
//<>テンプレート関数の自動インスタンス化:int MyMax(const int&a,const int&b)
cout << MyMax('a','b') << endl; //char MyMax(const char &a, const char &b) 
cout << MyMax("hello","world") << endl;
……
}
二、クラステンプレート
1、クラステンプレート:
(1)一般説明形式:
①クラス内実装
template
class
{
//類説明体
}
②類外実現
  class {};
 
template<タイプパラメータテーブル>
:(パラメータテーブル)
{
//メンバー関数定義体
}
 
template<タイプパラメータテーブル>
<タイプ名テーブル>:(パラメータテーブル)
{
//メンバー関数定義体
}
……
template<タイプパラメータテーブル>
<タイプ名テーブル>:(パラメータテーブル)
{
//メンバー関数定義体
}
(2)構文:
①クラステンプレートのインスタンス化:テンプレートのパラメータを特定のデータ型に置き換えて、特定のクラス(テンプレートクラス)を得る.
②テンプレート類も対象としてインスタンス化できます.
③クラステンプレートのインスタンスを次のように作成します.
クラス名オブジェクト名;
④クラステンプレートには非タイプテンプレートパラメータがあり得る.
⑤クラステンプレートにはデフォルト値があります.
2、クラステンプレートは2回インスタンス化されます.
(1)クラステンプレートをテンプレートクラスにインスタンス化する.
(2)テンプレートクラスでオブジェクトをインスタンス化する.
 
3、例:(デフォルトを使用したコード)
#include

#include

#include

#include

//define MAX_SIZE 1024



using namespace std;



class A

{

     public:

              A()

              {

                      

              }

              int num;

};



//template 

template  >

class Stack

{

     public:

              Stack()

              {

                       top = -1;

//                    memset(data,0,sizeof(data));

              }

             

              void push(T num)

              {

//                    top ++;

//                    data[top] = num;

                       data.push_back(num);

              }

             

              T pop(T num)

              {

//                    return data[top --];

                       return data.pop_back();

              }

     private:

              int top;

//           T data[MAX_SIZE];

              CONT data; // == vector data;

};



int main()

{

     Stack s1;

     s1.push(5);

    

     Stack s2;

     s2.push("hello");

    

     A a;

     Stacks3;
     s3.push(a);
    
     return 0;
}