- 函数模板
- 类模板
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
对于实现不同类型的交换函数,我们可以使用函数重载来实现,但是只要有一种新的类型出现,我们就要写一种函数,这样代码的复用性比较低,代码的可维护性也比较低,c++提供了模板,来解决这个问题,注意模板只是简化了程序员的工作,让编译器根据不同的类型来实现不同类型的函数/类,
一.函数模板
1.1函数模板的定义
函数模板代表了一些功能相同,但是参数类型不同的函数。如果没有调用函数模板,函数模板并没有占据空间,只有调用时才会开辟空间,根据具体参数类型产生对应的函数。
1.2格式
template<class T1, class T2....>
返回值类型 函数名(参数列表)
{
//---
}
- template:是关键字
- class:是定义模板参数的关键字,也可以用typename
1.3原理
在编译阶段,编译器根据传入的实参类型来进行推导出对应模板参数类型,然后产生一份专门处理对应类型的函数代码。
1.4使用
对于模板函数实例化,可以隐式的调用,编译器会自动推导出模板参数的类型,也可以显示调用
template<class T>
void Swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
int main()
{
//隐式实例化
int a = 1, b = 2;
Swap(a, b);
//显式实例化
Swap<int>(a, b);
return 0;
}
注意:
- 当一个非模板函数和模板函数同时存在时(可以实例化为非模板函数的模板函数),编译器会调用非模板函数
二.类模板
2.1类模板的定义
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
2.2类模板的使用
类模板和函数模板不同,类模板只能显式调用,因为编译器不能自动推导类型。
template<class T>
class A
{
}
int main()
{
A<int> aa;
A<double> bb;
}
- 注意:typedef不能替代模板,因为模板可以同时实例化两个类型不同的类,而typedef类只有一份