所谓模板,其实就是一种使用“数据类型”作为参数来产生一系列函数或类的机制。模板是C++支持多态性的一种工具。通过模板可以产生类或函数的集合,它们有能力操作不同的数据类型。模板方便了更大规模的软件开发。减少了程序员编写代码的工作量。
一、学习模板函数之前,首先看看函数重载存在的缺陷。
int Max(int x, int y)
{
return x>y?x:y ;
}
double Max(double x, double y)
{
return x>y? x:y ;
}
int _tmain(int argc, _TCHAR* argv[])
{
int x = 7;
int y = 4;
cout<<Max( x, y)<<endl;
double a = 3.5;
double b = 4.5;
cout<<Max( a, b)<<endl;
system("pause");
return 0;
}
当输入参数的类型不一样时,需要重载相应的函数无疑增加了代码的数量。若没有重载相应的函数,由于c++中数据类型的默认转换规则,会自动的将数据类型进行转换,导致数据精度的丢失,会带来意想不到的结果。
如:上述代码没有重载double类型时,输入参数为3.5和4.5时,输出结果为4。这显然不是我们想要的结果。
二、解决办法
函数模板提供了一种机制通过它我们可以保留函数定义和函数调用的语义在一个程序位置上封装了一段代码确保在函数调用之前实参只被计算一次。
函数模板定义的语法格式如下:
template <class T1, class T2, …>
类型名 函数名(参数表)
{
函数体的定义
}
其中,template是声明函数模板的关键字。template后一对“<>”括起来且用“,”分隔的是函数模板参数表。
其中,<模板类型形参表>的类型可以是任何类型:包含基本数据类型,和类类型。
用函数模板,则不会出现上述问题,将上面两个函数用函数模板替换,具体代码如下:
template <class T1>
T1 Max (T1 x,T1 y)
{
return x>y?x:y ;
}
三、需要注意的问题
1、函数模板中的每一个类型参数在函数参数表中必须至少使用一次。
template <class T1, class T2>
void func1(T1 para1)//错误,没有使用T2
{// 函数体}
2、和普通的函数一样,对函数模板可以先声明模板,后使用模板,然后在文件的后边或其它文件中给出模板的定义。
当模板函数中包含不适合某一数据类型的操作时,无法实例化,有两种解决方案
1)针对该数据类重载模板函数中的操作
2)设计特定函数,这时,在使用特定函数时,将阻止编译器产生函数。
四、函数模板的优点
函数模板大大增强了函数设计的通用性。使用函数模板的方法是:
1、先说明函数模板,
2、然后实例化成相应的模板函数,
3、最后才可以调用模板函数,并执行。