1.函数模板
首先我们来实现一个交换函数,该函数一般用在测试排序算法
通过函数的重载我们可以实现不同类型的交换函数,但是这样子写只要有新类型的出现就需要增加对应的函数。而且代码的可维护性也比较低,一个出错可能所以的重载均出错。
为解决这类问题C++提供了这样一个模具,通过给这个模具不同的类型,来生成具体类型的代码。
函数模板的格式
template<typename T1, typename T2,…,typename Tn>
例如:
typename是用来定义模板参数的关键字,也可以使用class。
函数模板的原理
在编译器编译阶段,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。
例如当用int类型使用函数模板时,编译器通过对实参类型的推演,将T确定为int类型,然后产生一份专门处理int类型的代码。
函数模板的实例化
隐式实例化:让编译器根据实参推演模板参数的实际类型
上面注释的语句不能通过编译,因为在编译期间需要推演实参类型,但模板参数只有一个T,编译器无法确定T为int还是double而报错。
有两种处理方式:1.用户自己强转 2.使用显示实例化
显示实例化:在函数名后的<>中指定模板参数的实际类型
如果类型不匹配,编译器会先尝试进行隐式类型转换,转换不成功会报错。
模板参数的匹配原则
1.一个非模板函数可以和一个同名的模板函数同时存在,而且该函数模板还可以被实例化为这个非模板函数。
2.对于非模板函数和同名函数模板,如果其他条件都相同,在调用时会优先调用非模板函数,如果模板可以产生一个具有更好匹配的函数,会优先调用模板函数。
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。
2.类模板
类模板的定义格式
类模板的实例化
类模板的实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>里就行。