清晰概念
类模板和模板类
- 类模板表示是一个模板,可以用此模板产生其他模板类
- 模板类是由模板而产生的类
函数模板和模板函数
- 模板函数重点是模板,表示他是一个模板,用来产生模板函数
- 模板函数就是用模板刻出来的函数
运行机制
1.编译器会对函数模板进行两次编译
(在声明的地方对模板代码本身进行编译;在调用的地方再对参数替换后的代码进行编译。)
2.编译器在对函数模板编译时与调用的次数无关,与调用时参数类型有关
实例化和具体化
实例化
在代码中包含函数模板本身并不会生成函数定义,他只是用于生成函数定义的方案…编译器使用模板为特定类型生成函数定义时,得到的是模板实例,模板并非函数定义,但模板实例就是进行定义,这种叫隐式实例化.
现在C++支持显示实例化,比如fun,意思是使用fun()模板生成一个使用int类型的实例
具体化
显式具体化的形式为template <> void fun(int) || template <> void fun(int);
这些声明的意思是不能用模板产生函数定义而应该使用专门为int类型显式地定义的函数定义,具体化之后可以看为一个正常的fun(int)函数来使用…
编译器如何选择最佳函数
对于重载,函数模板和函数模板重载,需要有一个良好的策略来确定使用哪一个函数定义,这个过程称为重构解析.
- 创建函数候选列表
- 使用候选函数列表创建可行函数列表
- 确定最佳可行函数
可行函数从最佳到最差 - 完全匹配
- 提升转换
- 标准转换
- 用户自定义的转换
函数模板重载
- 函数模板可以像普通函数一样被重载
- C++编译器优先考虑普通函数
- 如果函数模板可以产生一个更好的匹配,则选择模板
- 可以通过空模板实参列表的语法限定编译器只通过模板匹配