模板
模板(template)是一個將數據類型參化的工具,它提供了一種將代碼與數據類相脫離的機制,即代碼不受具體的數據類型的影響。模板分為函數模板和類模板兩種。
(1)函數模板
函數模板是一種不說明某些參數的數據類型的函數。例如,下面定義了一個可對任何類型變量進行操作(求絕對值)的函數模板。
- template <class T>
- T abs(T val)
- {
- return val<0 ? -val : val;
- }
template <class T> //或寫成:template <typename T>
T abs(T val)
{
return val<0 ? -val : val;
}
在函數模板被調用時,編譯器根據實際參數的類型確定模板參數T的類型,并自動生成一個對應的函數,即模板函數。模板參數的類型不同,生成的模板函數也不同。
例 1 函數模板的定義和使用
- #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) //定義函數模板
{
return val<0 ? -val : val;
}
void main()
{
int i=100;
cout <<abs(i)<<endl; //類型參數T替換為int
long l=-12345L;
cout <<abs(l)<<endl; //類型參數T替換為long
float f=-125.78F;
cout <<abs(f)<<endl; //類型參數T替換為float
}
定義函數模板時也可以使用多個類型參數,這時每個類型參數前面都要加上關鍵字class或typename,其間用逗分隔,其形式如下所示。
template <class T1,class T2,class T3>
例 2 使用多個類型參數的函數模板
- #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; //類型參數T1替換為int,T2替換為float
}
(2)類模板
使用多個類型參數的類模板
- #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個類型參數
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();
}
原帖地址:
http://fpwjp.javaeye.com/blog/377892