0x00. 模板简介
- 两种模板:类模板和函数模板
- 代码重用:允许函数和类以泛型的形式表现和运行,针对各种类型都适用,而无需为每种类型单独写一份代码
- 模板实例化
- 模板声明:未给出雷和函数的完全定义,只是给出了函数和类的语法框架
- 实例化:从模板构建出完全定义的函数和类
- 显示实例化:代码中明确指定模板参数
- 隐式实例化:自动推导模板参数
- 模板定义
- 声明模板参数时,使用 class 和 typename 均可,但是不能使用 struct
0x01. 函数模板
- 模板被编译两次:
- 没有实例化之前,检查模板代码本身是否有语法错误;
- 实例化期间,检查对模板代码的调用是否否合法。
- 参数推导
- 模板参数,是由传递给模板函数的实参决定的
- 不允许自动类型转换
- 解决方式1:static_cast 强制类型转换
- 解决方式2:显示指定模板参数
- 函数模板重载:
- 模板函数与普通函数可以共存
- 重载函数裁决:优先非模板函数,而不是从模板实例化
- 允许空模板参数列表
- 模板参数推导,找不到匹配的函数时,只能调用非模板函数(实参可以进行自动类型转换)
0x02. 类模板
- 类模板参数,可以是某个型别或者一个变量(int/enum),变量可以有默认值
- 类模板的声明和实现中,如果需要用到类本身,需要使用模板类的完整定义(带模板实参)
- 模板参数如果带有
<>
符号, 应该在中间加空格:Stack<Stack<int> >
- 类模板的特化
- 偏特化