前提:
模板概念:(引用自菜鸟教程)
即:模板是蓝图(类或对象)的蓝图(通过传不同信息(类型)创建不同函数和类),能使编程不受类型限制,让编译器解决,避免了重复工作。
一,函数模板
小概念:
模板函数与函数模板
模板参数列表
1.形式:
template<typename T,......>或者template<class T,......>,
将函数某类型替换为列表中的类型名。
注意:template模板参数列表和函数模板之间是1对1的。
2.使用:
(1)单个类型参数
(iostream的std命名空间中有swap()函数模板,直接用就行)
(2)多个类型参数
(1)返回某个参数类型
(2)返回自动类型(建议,方便隐式类型转换)
3.原理:
编译器帮你匹配函数参数类型,匹配到函数后再将传入类型替换形参与代码块中的。
问题:
1.为什么参数不用auto
答;auto不能用来做参数,但可以做返回值类型。
4.模板的实例化
定义:
用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例 化。
1.隐式实例化:
实质:让编译器根据实参推演模板参数的实际类型
要传多于模板参数列表类型,就要用显式实例化
2.显式实例化
用法:在函数名后的<>中指定模板参数的实际类型
实质:指定模板参数类型,让编译器帮你转换
只指定一个,编译器会从所有函数模板里找与剩下的参数匹配的函数模板
5.匹配:
1. 一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数。(一个成品一个半成品,如果指定,可以将半成品变成成品用)
-->用显式实例化指定模板了。
--------------
2.当模板函数与普通函数都存在,如果类型匹配,编译器会优先选择普通函数
(匹配的成品会被优先选择)
例子1同上图第一个Add选的普通函数。
--------------
3.模板函数之间就看谁能更好匹配形参。(看哪个成品/半成品更好)
总结:
1.显式实例化指定模板函数,再看剩下参数哪个匹配
2.看哪个函数更匹配形参
3.模板函数和普通函数同时匹配选普通函数(效率高)
二,.类模板
1.格式:
template <class C1,.....>
class 类模板名
{ // 类内成员定义 };
2.实例化:
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟<>,然后将实例化的类型放在<>,中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。->类不能重载,模板名不能为类名。
声明与定义分离
要求:1.模板函数 必须在前面加上模板参数列表,告诉编译器是哪个模板的东西。
2.模板类成员函数 在模板参数列表基础上 必须前面加模板名<所有模板参数>::
2.不能声明与定义分离在两个文件。->编译器找这麻烦