函数模板
利用函数模板,可以建立一个具有通用功能的函数,支持不同的函数参数和返回值,达到减少代码书写量的目的。
函数模板的语法形式如下:
template <typename T> // T代表在函数模板中要使用的通用类型,在该函数的调用过程中,T被具体化。
函数定义
例如重载函数,求绝对值的函数只要声明一个函数模板:
template <typename T>
T abs(T value)
{
return value>0? value: -value;
}
在主程序中可以这样使用函数模板:
int main()
{
int nValue=-1,nResult;
double dblValue=-1.2,dblResult;
nResult=abs(nValue);
dblResult=abs(dblValue);
cout<<nValue<<″ ″<<nResult<<endl;
cout<<dblValue<<″ ″<<dblResult<<endl;
return 0;
}
模板特化
定义:
template <typename T>
class XXX { ... }
特化:
template <> class XXX<int> { .... }
类模板
数据成员变成另外一种数据类型,或者干脆是一个类的对象,又要重新拷贝,重新进行修改。这样不仅程序的代码数量急剧增加,修改过程中也很容易出现各种疏漏。用一种类似函数模板的机制来结决问题——类模板。
C++语言中的类模板的语法定义如下:
Template <模板参数表>
类声明
注:当模板参数表中同时包含上述多项内容时,各项内容之间以逗号隔开。
与函数模板相同,类模板只有使用的时候才被具体化为某一种类型。
使用模板类来产生对象时,按如下形式声明: 模板<模板参数表> 对象名1,......对象名n;
//例子如下;
#ifndef EXAMPLE10_02_H
#define EXAMPLE10_02_H
template <class T>
class Max //声明类模板Max
{
private:
T item1, item2, item3; //类型为T,T在该类的对象生成时具体化
public:
Max(){}
Max(T thefirst,T thesecond, T thethird):item1(thefirst),item2(thesecond),item3(thethird)
{
}
T GetMaxItem()
{
T maxitem;
maxitem=item1>item2 ? item1: item2;
maxitem=maxitem>item3? maxitem: item3;
return maxitem;
}
} ;
#endif
//测试:
void CtesttempDlg::OnBnClickedButton1()
{
// TODO: Add your control notification handler code here
Max<int> nmyMax(1,2,3);
int a = nmyMax.GetMaxItem();
Max<double> dblmyMax(1.2,1.3,-1.4);
double b = dblmyMax.GetMaxItem();
cout<<nmyMax.GetMaxItem()<<endl;
cout<<dblmyMax.GetMaxItem()<<endl;
}