为什么需要模板
相信写过Java的童鞋们都知道泛型编程,在C++中与之对应的就是模板。
模板是一种对类型进行参数化的工具,通常有两种形式:函数模板和类模板。
模板是一些为多种类型而编写的函数和类,而且这些类型都没有指定。当使用模板的时候,你只需要把所希望的类型作为一个(显式或者隐式的)实参传递给模板。 另外,由于模板是语言本身所具有的特性,所以它完全支持类型检查和作用域。使用模板的目的就是能够让程序员编写与类型无关的代码,尽可能地减少重复代码。
众所周知,C++是一门强类型的静态语言。在声明变量、函数和大多数其他类型的实体的时候,C++要求我们使用指定的类型。 然而,对于许多代码,除了类型不同之外,其余的代码看起来都是相同的。例如我们需要实现一个交换两个变量的函数,为了通用性, 这个交换变量的函数不能固定两个变量的类型,这就使得模版横空出世。。。
在C++标准库中,几乎所有的代码都是模板代码,可以说没有C++模板就没有STL。
模板函数
首先我们看下函数模板的格式:
template
返回类型 函数名(参数列表)
{
函数体
}
或者使用class关键字也可:
template
返回类型 函数名(参数列表)
{
函数体
}
为什么会有两种不同的格式呢?这是因为鉴于历史的原因,你可能还会使用class取代typename,来定义类型参数。 在C++语言的演化过程中,关键字typename的出现相对较晚一些;在它之前,关键字class是引入类型参数的唯一方式,并一直作为有效方式保留下来。 但是更加标准的格式是使用typename关键字。
例如我们使用模板定义了返回较大值的模板函数:
template
const T& max_fun(const T& a,const T& b){
return a >= b? a:b;
}
下面我们调用一下我们定义的模板函数max_fun:
int main(int argc, char* argv[]) {
// 都是int类型 ok
int max = max_fun(10,10);
// 都是double类型 ok
int max = max_fun(10,10);
// 一个int类型,一个double类型 编译不通过
int max = max_fun(10,11.0);
std::cout