1.模板的概念
模板就是建立通用的模具,从而提高复用性。提到复用性,想必大都会想到一个老朋友---函数,事实也确实如此,C++中的模板两大应用之一就是函数模板。但需要注意的是,C++中的模板只是一个框架,并非某个实例,而仅仅是一个框架,因此在使用时需要给模板以确定的“内容”才能正常使用模板。
注意:
- 模板不可以直接使用,它只是一个框架
- 模板的通用并不是万能的
2.函数模板语法
首先来说一下函数模板的作用,在C++中,我们可以通过模板建立一个通用函数,其函数返回值类型和形参的类型可以是不具体指定的,而是可以利用一个虚拟的类型来表示。
语法:
1 template<typename T>
2 函数声明或定义
例如:
template<typename T>
T mysum(T * begin,T * end)
{
T * p = begin;
T ans = 0;
for(T * p = begin; p != end;p++)
{
ans = ans + *p;
}
return ans;
}
上例就是一个函数模板的应用,其实实现了一个未知数据类型数组的加和,当然---并不包括数组最后一项。具体逻辑我也不再展开解释,有兴趣的同学可以自行编码运行。
解释:
template --- 声明创建一个模板
typename ---表示其后面的一个符号是一个虚拟数据类型,也可以用class代替
T --- 通用的数据类型,名称可以替换,通常为大写字母
3.函数模板的两种使用方法
- 自动类型推导
- 显示指定类型
首先来看自动类型推导,其实顾名思义,就是让编译器自己去猜测我们的传给模板的数据类型是什么,体现在代码中就是---看上例,这个定义好的mysum()函数有两个参数,假设现在又一个整型的数组arr[601]需要求和那我们直接这样调用模板mysum(arr,&arr[600]),就是自动类型推导式的调用,而显示类型推导就是mysum<int>(arr,&arr[600]),它们看起来差别不大,而且你在实际的编码过程中会发现好像加不加<int>都没什么差别,但事实并非如此,因为有时候---当模板函数没有参数时(此时编译器也就推到不出来指定的类型是什么了),则必须给typename所指定的虚拟类型一个确定的数据类型才可以正常使用函数模板。
4.函数模板的注意事项
- 自动类型推导,必须推导出一致的数据类型T,才可以正常使用。
- 模板必须要确定出T的类型才可以使用
下面再放一张示例
template<typename T>
void myswap(T &a, T &b)
{
T temp = a;
a = b;
b = temp;
}
void test01()
{
int a = 109;
double b = 6.01;
myswap(a,b);//错误,因为编译器会推导出两个不同的T类型,出现二义性
double c = 12.07;
double d = 6.01;
myswap(c,d);//正确
}