模板
模板(template)是一個(gè)將數(shù)據(jù)類型參化的工具,它提供了一種將代碼與數(shù)據(jù)類相脫離的機(jī)制,即代碼不受具體的數(shù)據(jù)類型的影響。模板分為函數(shù)模板和類模板兩種。
(1)函數(shù)模板
函數(shù)模板是一種不說(shuō)明某些參數(shù)的數(shù)據(jù)類型的函數(shù)。例如,下面定義了一個(gè)可對(duì)任何類型變量進(jìn)行操作(求絕對(duì)值)的函數(shù)模板。
- template <class T>
- T abs(T val)
- {
- return val<0 ? -val : val;
- }
template <class T> //或?qū)懗?template <typename T>
T abs(T val)
{
return val<0 ? -val : val;
}
在函數(shù)模板被調(diào)用時(shí),編譯器根據(jù)實(shí)際參數(shù)的類型確定模板參數(shù)T的類型,并自動(dòng)生成一個(gè)對(duì)應(yīng)的函數(shù),即模板函數(shù)。模板參數(shù)的類型不同,生成的模板函數(shù)也不同。
例 1 函數(shù)模板的定義和使用
- #include <iostream.h>
-
- template <class T>
- T abs(T val)
- {
- return val<0 ? -val : val;
- }
-
- void main()
- {
- int i=100;
- cout <<abs(i)<<endl;
- long l=-12345L;
- cout <<abs(l)<<endl;
- float f=-125.78F;
- cout <<abs(f)<<endl;
- }
#include <iostream.h>
template <class T> //定義模板
T abs(T val) //定義函數(shù)模板
{
return val<0 ? -val : val;
}
void main()
{
int i=100;
cout <<abs(i)<<endl; //類型參數(shù)T替換為int
long l=-12345L;
cout <<abs(l)<<endl; //類型參數(shù)T替換為long
float f=-125.78F;
cout <<abs(f)<<endl; //類型參數(shù)T替換為float
}
定義函數(shù)模板時(shí)也可以使用多個(gè)類型參數(shù),這時(shí)每個(gè)類型參數(shù)前面都要加上關(guān)鍵字class或typename,其間用逗分隔,其形式如下所示。
template <class T1,class T2,class T3>
例 2 使用多個(gè)類型參數(shù)的函數(shù)模板
- #include <iostream.h>
-
- template <class T1,class T2>
- T1 Max(T1 x,T2 y)
- {
- return x>y ? x: (T1)y;
- }
-
- void main()
- {
- int i=100;
- float f=-125.78F;
- cout <<Max(i,f)<<endl;
- }
#include <iostream.h>
template <class T1,class T2>
T1 Max(T1 x,T2 y)
{
return x>y ? x: (T1)y;
}
void main()
{
int i=100;
float f=-125.78F;
cout <<Max(i,f)<<endl; //類型參數(shù)T1替換為int,T2替換為float
}
(2)類模板
使用多個(gè)類型參數(shù)的類模板
- #include <iostream.h>
-
- template <class T1,class T2>
- class MyTemClass
- {
- private:
- T1 x;
- T2 y;
- public:
- MyTemClass(T1 a,T2 b) { x=a;y=b; }
- void ShowMax()
- {
- cout <<"MaxMember="<<(x>y?x:y)<<endl;
- }
- };
-
- void main()
- {
- int a=100;
- float b=123.45F;
- MyTemClass<int,float> mt(a,b);
- mt.ShowMax();
- }
#include <iostream.h>
template <class T1,class T2> //使用2個(gè)類型參數(shù)
class MyTemClass //定義類模板
{
private:
T1 x;
T2 y;
public:
MyTemClass(T1 a,T2 b) { x=a;y=b; } //構(gòu)造函數(shù)
void ShowMax() //輸出最大的數(shù)據(jù)成員
{
cout <<"MaxMember="<<(x>y?x:y)<<endl;
}
};
void main()
{
int a=100;
float b=123.45F;
MyTemClass<int,float> mt(a,b); //聲明類模板的對(duì)象
mt.ShowMax();
}
原帖地址:
http://fpwjp.javaeye.com/blog/377892