C/C++クラステンプレート
4267 ワード
本文の目的:クラステンプレートを理解し把握する
リファレンスリソース:c++primer
テンプレートは非常に有用なもので、コードを書いて異なるデータ型に対応するために異なるバージョンを生成することができます.原理は、特定のコールまたはコンパイル時に異なるバージョンを生成することです.クラステンプレートは、メンバーのデータ型だけが異なるクラスの抽象であり、プログラマは、このクラスからなるクラスファミリー全体にクラステンプレートを作成し、プログラムコードを与えるだけで、さまざまな具体的なクラスを生成することができ、プログラミングの効率を大幅に向上させることができます.
フォーマットは:templateor templateここのclassはtypenameと区別されず、前者は古く、後者は後でタイプ名が続くことをより直感的に示します.
一、関数テンプレート:例:
説明:テンプレート宣言でclass and typenameの後に続くタイプパラメータと、intや他のカスタムタイプなどの他の宣言の後にある非タイプパラメータとを呼びます.関数テンプレートを使用する場合は、compare(1,3)などを直接呼び出すことができます.コンパイラは、対応するバージョンを自動的に生成します.inlineテンプレート関数の宣言でinlineを<>の後に置くには、次のようにします.
テンプレート関数の簡単な例1:
テンプレート関数の簡単な例2:
二、クラステンプレート:
リファレンスリソース:c++primer
テンプレートは非常に有用なもので、コードを書いて異なるデータ型に対応するために異なるバージョンを生成することができます.原理は、特定のコールまたはコンパイル時に異なるバージョンを生成することです.クラステンプレートは、メンバーのデータ型だけが異なるクラスの抽象であり、プログラマは、このクラスからなるクラスファミリー全体にクラステンプレートを作成し、プログラムコードを与えるだけで、さまざまな具体的なクラスを生成することができ、プログラミングの効率を大幅に向上させることができます.
フォーマットは:template
一、関数テンプレート:例:
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)テンプレートの宣言と定義におけるパラメータの名前は、例えば、宣言:template class A定義:template class A{}