C/C++クラステンプレート

4267 ワード

本文の目的:クラステンプレートを理解し把握する
リファレンスリソース:c++primer
テンプレートは非常に有用なもので、コードを書いて異なるデータ型に対応するために異なるバージョンを生成することができます.原理は、特定のコールまたはコンパイル時に異なるバージョンを生成することです.クラステンプレートは、メンバーのデータ型だけが異なるクラスの抽象であり、プログラマは、このクラスからなるクラスファミリー全体にクラステンプレートを作成し、プログラムコードを与えるだけで、さまざまな具体的なクラスを生成することができ、プログラミングの効率を大幅に向上させることができます.
フォーマットは:templateor templateここのclassはtypenameと区別されず、前者は古く、後者は後でタイプ名が続くことをより直感的に示します.
一、関数テンプレート:例:
template<class T> 
compare( const T &a, const T &b)
{ 
}

説明:テンプレート宣言でclass and typenameの後に続くタイプパラメータと、intや他のカスタムタイプなどの他の宣言の後にある非タイプパラメータとを呼びます.関数テンプレートを使用する場合は、compare(1,3)などを直接呼び出すことができます.コンパイラは、対応するバージョンを自動的に生成します.inlineテンプレート関数の宣言でinlineを<>の後に置くには、次のようにします.
template<class T> 
inline T compare( const T &a, const T &b)
{ }

テンプレート関数の簡単な例1:
#include "StdAfx.h"
#include <iostream> 

using namespace std; 
template<typename T> //    ,  T      

T max(T a,T b,T c) //        , T        
{ //               T  
	if(b>a) a=b; 
	if(c>a) a=c; 
	return a; 
}  

int main( )
{		
	int i1=185,i2=-76,i3=567,i; 
	double d1=56.87,d2=90.23,d3=-3214.78,d; 
	long g1=67854,g2=-912456,g3=673456,g; 

	i=max(i1,i2,i3); //      ,  T int   
	d=max(d1,d2,d3); //      ,  T double   
	g=max(g1,g2,g3); //      ,  T long   
	cout<<"i_max="<<i<<endl; cout<<"f_max="<<d<<endl; cout<<"g_max="<<g<<endl; 
	system("pause");
	return 0; 
}

テンプレート関数の簡単な例2:
#include "iostream"
using namespace std;
template<class T>
void PrintArray(T *Array,int count)
{
for(int i=0;i<count;i++)
cout<<Array[i]<<" ";
cout<<endl;
}
int main()
{
int a[5]={1,2,3,4,5};
double b[7]={1.1,2.2,3.3,4.4,5.5,6.6,7.7};
char c[6]="HELLO";
PrintArray(a,5);
PrintArray(b,7);
PrintArray(c,6);
system("pause");
return 0;
}

二、クラステンプレート:
<pre name="code" class="cpp">    //1.      。
    template<typename T1, typename T2>
    class MyClass {
        ... ...
    };
    //2.                   。
    template<typename T>
    class MyClass<T,T> {
        ... ...
    }
    //3.         int
    template<typename T>
    class MyClass<T,int> {
        ... ...
    }
    //4.           。
    template<typename T1,typename T2>
    class MyClass<T1*,T2*> {
        ... ...
    }
    //5.                。
    template<typename T>
    class MyClass<T*,T*> {
        ... ...
    }
    //6.       。
    int main() {
        MyClass<int,float> c1;      //  MyClass<T1,T2>
        MyClass<float,float> c2;    //  MyClass<T,T>
        MyClass<float,int> c3;      //  MyClass<T,int>
        MyClass<int*,float*> c4;    //  MyClass<T1*,T2*> 
        MyClass<int*,int*> c5;      //  MyClass<T*,T*>
        return 0;
    }
 
 
 
 

类模板简单举例1:

#include "StdAfx.h"
#include <iostream>
using namespace std;

template <typename T>
class classOne
{
private:
	T a;
public:
	T get(T b)
	{
		a=b*b;//   
		return a;
	}
};

template <typename TT>
class classTwo
{
private:
	classOne<TT> test;//  classTwo       ,                      
public:
	TT out(TT b)
	{
		return test.get(b);
	}
};

int main()
{
	classTwo<double> test2;//   
	cout<<test2.out(3.2)<<endl;
	system("pause");
	return 0;
}

クラステンプレートの使用は関数テンプレートとは異なり、クラステンプレートを呼び出すときに明示的にタイプパラメータTを指定する必要があります.例えば、私たちが定義したAの使用:Aai;A< char > ac; A< vector> av; A< string > as;
(1)パラメータについては,テンプレートパラメータがその役割ドメインでグローバルパラメータを遮断する.(2)パラメータの名前はテンプレート内部で再利用できません.つまり、1つの名前は1つのテンプレートで1回しか使用できません.template//error
ただし、これは可能です(複数のタイプのパラメータ)
template(3)テンプレートの宣言と定義におけるパラメータの名前は、例えば、宣言:templateclass A定義:templateclass A{}