### 1.1 模板的概念
模板提高复用性,照片模板,PPT 模板,通用性强,并不是万能的。
```
模板的特点:
* 模板不可以直接使用,它只是一个框架
* 模板的通用并不是万能的
```
### 1.2 函数模板
* C++ 另一种编程思想为泛型编程,主要利用的技术就是模板
* C++ 提供两种模板机制:函数模板和类模板
#### 1.2.1 函数模板语法:
函数模板作用:
* 建立一个通用函数,其函数返回值类型和形参类型可以不具体指定,用一个虚拟的类型来代表
```
void f(int a)
```
模板语法:
```
template <typename T>
函数声明或定义
```
**解释:**
* template 英文是模板的意思,声明创建模板
* typename 数据类型,可以用 class 代替
* T 通用的数据类型,名称可以替换,通常为大写字母
**总结**
1. 函数模板利用关键字 template
2. 使用函数模板有两种方式:自动类型推导、显示指定类型
3. 模板的目的是为了提高复用性,将类型参数化
#### 1.2.2 函数模板注意事项:
注意事项:
* 自动类型推导,必须推导出一致的数据类型T,才可以使用
* 模板必须要确定出T的数据类型,才可以使用
**总结:**
* 使用模板时必须确定出通用数据类型 T,并能够推导出一致的类型
#### 1.2.3 函数模板案例
案例描述:
* 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序
#### 1.2.3 普通函数与模板函数的区别:
* 普通函数调用时可以发生自动类型转换(隐式类型转换)
* 函数模板调用时,如果利用自动类型推到,不会发生隐式类型转换
* 如果利用显示类型指定的方式,可以发生隐式类型转换
#### 1.2.3 普通函数与模板函数的调用规则:
调用规则如下:
1. 如果普通函数和函数模板都可以实现,优先调用普通函数
2. 可以通过空模板参数列表来强制调用函数模板
3. 函数模板也可以发生重载
4. 如果函数模板可以产生更好的匹配,优先调用函数模板
**总结:**
* 既然提供了函数模板,就不要提供普通函数了,容易产生二义性。
#### 1.2.3 模板的局限性:
* 模板的通用性并不是万能的,
* 为了解决数组、或自定义类型提供模板的重载,提供具体化的模板