目录
一.泛型编程
使用同一个函数处理不同参数类型时,我们可以使用函数重载来实现这个功能。
函数重载给了我们很大的便利,但是函数重载可能也会出现不好之处:
- 重载函数仅仅只是类型不同,代码的复用率比较低,只要有新类型出现时,就需要增加对应的函数
- 代码的可维护性比较低,一个出错可能导致所有的重载均出错
既然函数重载有一些缺点,那么有没有办法来改正呢,前辈们肯定是解决了这个问题了,此时就有了泛型编程
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。
二.函数模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本
2.1 函数模板格式
template<typename T1, typename T2, ....., typename Tn>
返回值类型 函数名(参数列表){ }
template<typename T>
T Add(T s1, T s2)
{
return s1 + s2;
}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
2.2 函数模板的原理
模板是一个蓝图,记住它本身并不是函数,是编译器使用这个模板来产生具体类型函数的。模板就是将本应该由我们做的重复的事情给了编译器
在编译阶段,编译器会根据传入的实参类型来推演出对应类型的函数以供调用。
例如:
template<typename T>
void Swap(T&