通过侯老师编写的书籍MFC中,对Template有了一个更加深刻的认识。
首先,介绍模板函数template functions:
计算一个数值幂次方,函数名为power。该函数只接受正幂次方数,如果为负幂次方,使结果为0.
模板函数中,<class T>只不过是表示:T 是一种类型,该类型可以是int,long,也可以是double类型,而此一类型将在调用此函数时才给予。
下面是power函数的template版本:
template<class T>
T power(T base,int exponent)
{
T result=base;
if(exponent==0)
return (T)1;
if(exponent<0)
return (T)0;
while(--exponent)
result *=base;
return result;
}
注意返回值必须为类型T,以吻合template函数的声明。
下面是template函数的调用方法:
#include "iostream.h"
void main()
{
int i=power(5,4);
long l=power(1000L,3);
cout<<"i= "<<i<<endl;
cout<<"l= "<<l<<endl;
}
结果为:
i=625
l=1000000000
在第一次调用时,T变成了int,在第二次调用中T变成了long。
下面是模板类template classes的介绍:
同样举个例子,让Cthree类储存三个成员变量,成员函数Min传回最小值,成员函数Max传回最大值。我们把他设计为template classes,以便这个类能适应于各个样式的数据类型:
template <class T>
class CThree
{
public:
CThree(T t1,T t2,T t3);
T Min();
T Max();
private:
T a,b,c;
};
下面是成员函数:
template <class T>
T CThree<T>::Min()
{
T minab=a<b?a:b;
return minab<c?minab:c;
}
template <class T>
T CThree<T>::Max()
{
T maxab=a<b?b:a;
return maxab<c?c:maxab;
}
CThree<T>::CThree(T t1,T t2,T t3):
a(t1),b(t2),c(t3)
{
return;
}
把T看成是int,long,double等类型就可以了,还要注意每个成员函数前都要加上template <class T>,而且类名称应该使用CThree<T>。
下面是template class 的使用方式:
#include "iostream.h"
void main()
{
CThree<int>obj1(2,5,4);
cout<<obj1.Min()<<endl;
cout<<obj1.Max()<<endl;
CThree<float>obj2(8.52,-6.75,4.54);
cout<<obj2.Min()<<endl;
cout<<obj2.Max()<<endl;
}
结果为:
2
5
-6.75
8.52