为什么要有函数模板
需求:写n个函数,交换char类型、int类型、double类型变量的值。
1 |
|
函数模板语法
函数模板定义形式
template <类型形式参数表>
类型形式参数的形式为:
typename T1,typename T2, …… ,typename Tn
或者:
class T1,classT2, …… ,class Tn
函数模板定义由模板说明和函数定义组成
模板说明的类属参数必须在函数定义中至少出现一次
函数参数表中可以使用类属类型参数,也可以使用一般类型参数
函数模板的调用形式:
1 | myswap<float>(a,b);//显示类型调用 |
函数模板做函数参数
1 |
|
函数模板遇上函数重载
函数模板不允许自动类型转化
普通函数能够进行自动类型转换
1 函数模板可以像普通函数一样被重载
2 C++编译器优先考虑普通函数
3 如果函数模板可以产生一个更好的匹配,那么选择模板
4 可以通过空模板实参列表的语法限定编译器只通过模板匹配
1 | //函数模板遇上函数重载 |
函数模板机制
编译器并不是把函数模板处理成能够处理任意类的函数
编译器从函数模板通过具体类型产生不同的函数
编译器会对函数模板进行两次编译
在声明的地方对模板代码本身进行编译;在调用的地方对参数替换后的代码进行编译。