@[TOC]
前言:
背景
C++中对于那些功能类型的函数,比如Swap(a,b)函数,不同的Swap唯一的区别就是a,b的 类型,如果对于每种类型都定义一个Swap函数,很显然这非常冗余,因此C++中提出了泛型编程,即根据实参的类型,编译器自动绝定形参的类型,这就极大的解决代码的冗余度,减少人工消耗。
泛型编程
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础 。其中模板分为:函数模板与类模板
模板是一个空壳,只有确定了具体的某些参数的意义,这个模板才有意义,这就像膜具一样,只有填入东西,才有东西产生
函数模板
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
格式
template
返回值类型 函数名(参数列表){}
typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
作用域
一次template对==最近的一个==函数模板或者类模板有效。
实例化
隐式的实例化
编译器通过实参的类型来确定形参的类型,一旦一个模板参数T实例化后,后续的同一个T都是一样的。
显示的实例化
1.通过在函数名后的<>中指定模板参数的实际类型
2.依据指定的类型,顺序确定模板参数的实际类型
模板参数的匹配原则
完整定义的函数优先原则,模板函数次之。
模板函数的实例化是需要消耗时间的,
类模板
格式
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
类模板函数的实例化
- 正常中使用中,类名代表类型,但是在类模板中类名和类型是不同的
- 类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>中即可,类模板名字不是真正的类,而实例化的结果才是真正的类.