以下文章不重要,看我名字,你懂的
template 是 c++ 适当重要的组成部分,可谓 c++语言的一大利器。在大大小小的 c++ 程序中,模板无处不在。c++ templates 作为模板学习的经典书本,向来被无数 c++学习者所推崇。第二版书本覆盖了 c++ 11 14 和 17 标准,值得程序猿们精读学习,特此收拾学习笔记,将每一部分自认为较为重要的部分逐条陈列,并对少量错误代码进行修改
一、函数模板
1.1 函数模板初探
1.模板实例化时,模板实参有必要支撑模板中类型对应的所有运算符操作。
2.模板编译时会进行两阶段查看
a.模板界说时,进行和类型参数无关的查看,如未界说的符号等。
b.模板实例化时,进行类型参数相关的查看。
3.根据两阶段查看,模板在实例化时要看到完整界说,最简单的方法是将完成放在头文件中。
1.2 模板参数揣度
1.函数模板的模板参数能够经过传递的函数参数进行揣度。
2.函数揣度时会用到参数类型转化,规矩如下:
a.假如函数参数是按引证传递的,任何类型转化都不被答应。(此处有疑问,const 转化还是能够的)
b.假如函数参数是按值传递的,能够进行退化(decay)转化:const(指针或者引证只要顶层 const 能够被疏忽) 和 volatile 被疏忽;引证变为非引证;数组和函数变为对应指针类型。
3.上文的最终一句调用,类型揣度具有二义性,无法正确实例化。能够经过以下方法处理
a.类型转化:
b.显式指定模板实参:
4.函数模板无法经过默许参数揣度模板参数。假如函数模板只要一个函数参数,且函数参数供给了默许值的情况,应该为模板类型参数 T 也供给和函数参数默许值匹配的默许类型。
1.3 多模板参数
1.当函数回来类型不能或不便由函数参数类型直接揣度时,能够在函数模版中新增模板参赛指定回来类型。
2.c++11 之后,能够经过 auto + decltype +尾后回来类型 揣度函数模板回来类型。当函数参数为引证类型时,回来类型应该为非引证。而decltype 会保留引证,因而还需经过 decay 进行类型退化。
3.c++14 之后,能够经过 auto 直接揣度函数模板回来类型,条件是函数内部的多个回来语句揣度出的回来类型要一致。auto 会主动对类型进行 decay。
4.c++11 之后,能够经过 common_type 回来多个模版类型参赛的公共类型,common_type 回来的类型也是 decay 的。
1.4 默许模板参数
1.能够给模板参数指定默许值。
1.5 函数模板重载
1.一个非模板函数能够和同名的函数模板共存,并且函数模板可实例化为和非模板函数具有相同类型参数的函数。函数调用时,若匹配度相同,将优先调用非模板函数。但若显式指定模板列表,则优先调用函数模板。
2.函数模板不能够进行类型主动转化,非模板函数能够。
3.调用函数模板时,有必要保证函数模板现已界说。



