C++におけるテンプレートTemplateの使用


1、c++Templateではtypenameとclassの2つのキーワードが使われているところが多く、置き換えられるようですが、この2つのキーワードはまったく同じではないでしょうか.答:classはクラスを定義するために使用され、テンプレートにc++を導入した後、最初にテンプレートを定義する方法は:templateである.ここでclassキーワードはTがタイプであることを示しているが、その後、classのこの2つの場所での使用が混同をもたらす可能性があることを避けるためにtypenameというキーワードを導入し、classと同じように後の記号がタイプであることを示している.これにより、テンプレートを定義する際に、template.テンプレート定義構文では、キーワードclassはtypenameと全く同じ役割を果たします.
2.クラステンプレートとテンプレートクラスの概念
(1)クラステンプレートクラステンプレートクラステンプレート(クラス属クラスまたはクラス生成クラスとも呼ばれる)では、クラスの一部のデータ・メンバー、暗記メンバー関数のパラメータ、一部のメンバー関数の戻り値を任意のタイプ(システム定義およびユーザー定義を含む)で取得できるように、クラスにパターンを定義できます.クラス内のデータ・メンバーのデータ型が特定できない場合、またはメンバー関数のパラメータまたは戻り値のタイプが特定できない場合は、特定のクラスではなく、クラスを表すテンプレートとして宣言する必要があります.(2)クラステンプレート定義はクラステンプレートを定義し、一般的には2つの方面の内容がある:A.まずクラスを定義し、そのフォーマットは:
template <class T>
class foo
{
……
}

fooはクラス名で、クラス定義体では、汎用データ型のメンバーを使用する場合、関数パラメータの前にTを付ける必要があります.汎用タイプTは通常のメンバー変数のタイプとして使用できます.constとstaticメンバー変数、およびメンバー関数のパラメータと戻りタイプとして使用できます.例:
template<class T>
class Test{
private:
    T n;
    const T i;
    static T cnt;
public:
    Test():i(0){}
    Test(T k);
    ~Test(){}
    void print();
    T operator+(T x);
};

B.クラス定義体外定義メンバー関数の場合、このメンバー関数にテンプレートパラメータが存在する場合、一般クラスの体外定義メンバー関数と同様の定義が必要であるほか、関数体外でテンプレート宣言を行う必要がある.
template<class T>
void Test<T>::print(){
    std::cout<<"n="<<n<<std::endl;
    std::cout<<"i="<<i<<std::endl;
    std::cout<<"cnt="<<cnt<<std::endl;

}

関数が汎用タイプを返すタイプである場合は、関数名のクラス名の接尾辞に「」を付けます.例:
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}
template<class T>
T Test<T>::operator+(T x){
               return n + x;
               }

C.クラス定義体外でconstメンバーとstaticメンバー変数を初期化する方法と、通常のクラス体外でconstメンバーとstaticメンバー変数を初期化する方法は基本的に同じであり、唯一の違いはテンプレートを宣言することである.例えば、
template<class T>
int Test<T>::cnt=0;
template<class T>
Test<T>::Test(T k):i(k){n=k;cnt++;}

(3)クラステンプレートの使用クラステンプレートの使用は、実際にはクラステンプレートを特定のクラスにインスタンス化し、そのフォーマットは:クラス名<実際のタイプ>である.テンプレートクラスは、クラステンプレートがインスタンス化された生成物です.イメージポイントの例を話しましょう.私は類のテンプレートをビスケットと同じ型にたとえて、テンプレート類はこの型で作ったビスケットで、このビスケットがどんな味なのかはあなた自身が実例化の時にどんな材料を使ったのかを見て、あなたはチョコレートビスケットを作ることができて、あんこビスケットを作ることができて、これらのビスケットの材料が異なる以外に、その他のものはすべて同じです.3.関数テンプレートとテンプレート関数
(1)関数テンプレート関数テンプレートは、複数の異なるパラメータをサポートし、関数を再ロードする関数体の重複設計を回避するために汎用的な関数を作成するために使用することができる.その最大の特徴は、関数で使用されるデータ型をパラメータとすることです.関数テンプレートの宣言形式は次のとおりです.
template<typename( class) T>
<    ><   >(   )
{
       
}

ここでtemplateはテンプレート関数を定義するキーワードである.templateの後ろの括弧は省略できません.typename(またはclass)は、データ型パラメータ識別子を宣言するキーワードであり、後続の識別子がデータ型識別子であることを示す.このように、後で定義されるこの関数では、実パラメータデータ型に基づいてデータ型を決定したい変数は、データ型パラメータ識別子で説明することができ、この変数が異なるデータ型に適応できるようにする.例:
template<typename( class) T>
T fuc(T x, T y)
{
    T x;
    //……
}

関数テンプレートは、直接実行できる関数ではなく、実際の状況に基づいてタイプパラメータ識別子の代わりに実パラメータのデータ型を使用した場合にのみ、関数の記述、すなわちテンプレートを宣言します.(2)テンプレート関数:テンプレート関数の生成は,関数テンプレートのタイプをインスタンス化するプロセスである.例:
 double d;
     int a;
     fuc(d,a);

関数テンプレートのT生成関数の代わりに、実パラメータdのデータ型doubleが使用されます.
double fuc(double x,int y)
{
    double x;
    //……
}