一、模版概念的引入
我们都知道,一个事物的产生与存在一定有自己的独特的作用,任何东西都不会无缘无故的出现,如果一个事物的功能能完全被另一个事物代替,那么它也就没有必要出现了,今天我们要一起讨论的是模版,那么我们就先来看看在C++中引入模版的原因。
在以前的学习中,实现一个加法函数是再简单不过的事了,但是如何事先一个通用的加法函数呢?
方法一:通过函数重载,根据每个所需相同行为的不同类型重新实现。
int类型数据的加法:
Int Add(const int &_Left,const int &Rigth)
{
Return _Left+_Right;
}
float类型数据的加法:
float Add(const float &_Left,const float &Rigth)
{
Return _Left+_Right;
}
【缺点】
1、只要有新类型出现,就要重新添加对应函数。
2、除类型外,所有函数的函数体都相同,代码的复用率不高
3、如果函数只是返回值类型不同,函数重载不能解决
4、一个方法有问题,所有的方法都有问题,不好维护。
方法二:使用公共基类,将通用的代码放在公共的基础类里面
【缺点】
1、借助公共基类来编写通用代码,将失去类型检查的优点;
2、对于以后实现的许多类,都必须继承自某个特定的基类,代码维护更加困难。
方法三:使用特殊的预处理程序
#define ADD(a, b) ((a) + (b))
【缺点】
不是函数,不进行参数类型检测,安全性不高。
以上各种方法都有自己的缺陷,因此,C++中引入了泛型编程的概念。
泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段,模版是泛型编程的基础。
二、函数模版
函数模版:代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
函数模版的格式:
typename是用来定义模板参数关键字,也可以使用class。建议尽量使用typename。
注意:不能使用struct代替typename。
模板函数也可以定义为inline函数
template<typename T>
inline T Add(const T _left, const T _right)
{
return (_left + _right);
}
注意:inline关键字必须放在模板形参表之后,返回值之前,不能放在template之前