一、什么是模板
在C++编程中,当我们需要获取两个变量之间的较大值时,考虑到变量的类型可能会是int、double等,最常用的方法往往是通过重载函数,实现不同类型的函数版本:
int Max(int lhs, int rhs)
{
return (lhs > rhs) ? lhs : rhs;
}
double Max(double lhs, double rhs)
{
return (lhs > rhs) ? lhs : rhs;
}
此时,当我们接到新的需求,需要获取两个char类型的变量之间的较大值时,我们就会再添加一个char类型重载函数:
char Max(char lhs, char rhs)
{
return (lhs > rhs) ? lhs : rhs;
}
每当新增一种的类型的需求,又需要实现多一个重载函数,无形中增加了开发人员的工作,当函数逻辑比较复杂,而且比较庞大时,也容易出现错误。从上面的代码可以看出,三个版本的重载函数除了类型不一样之外,逻辑基本一致,完成的功能也是相同的,因此,如果能有一个通用的函数,抽取出这些相同的代码逻辑,将可以大大减少代码的重复,提高代码的重用性。此时,使用C++的模板就可以很好的解决这些问题,通过模板,可以使得开发人员写出更通用、更灵活、类型无关的代码。
二、模板的分类和格式
C++模板(template),主要分为函数模板和类模板。
2.1 函数模板
2.1.1 函数模板的格式和使用
template <class 形参名, class 形参名, ......>
返回类型 函数名(参数列表)
{
//函数体
}
模板定义以关键字template开始,后接以<>括号括住的模板形参表,其中class是关键字,在这里class可以使用typename 代替,<>括号中的模板形参使用逗号进行分隔。下面使用函数模板实现前面的求较大值函数:
template<typename T>
T Max(const T &lhs, const T &rhs)
{
return (lhs > rhs) ? lhs : rhs;
}
//测试用例:
int a = 34, b = 257;
double c = 1.4, d = 4.4;
char e = 'b', f = 'k';
cout<<Max(a, b)<<endl;//调用了int版本的模板函数,输出为:257
cout<<Max(c, d)<<endl;//调用了double版本的模板函数,输出为:4.4
cout<<Max(e, f)<<endl;//调用了char版本的模板函数,输出为:k
当对上面定义的函数模板进行编译时,类型T就会被实际传入的类型所代替,例如Max(a, b)中a和b是