1.非类型模板参数
模板参数分为类型形参和非类型形参
类型形参:出现在模板参数列表中,跟class或者typename之类的参数类型名称
非类型形参:就是用一种常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用(相较于宏的好处在于,宏是写死的,这个参数的数值,取决于你传进去的值)
注意:
1.浮点数,类对象以及字符串是不允许作为非类型模板参数的(C++20后开始接受浮点数)
2.非类型模板参数必须在编译期就能确认结果
仿函数 重载了 () 的类 普通函数无法保存状态(数据) “有记忆的智能函数”
特化 模板的特殊版本 通用模板无法处理特殊类型(如指针、自定义对象) “给特殊情况开的VIP通道”
2.模板的特化
2.1概念
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊的可能会得到一些错误的结果,需要特殊处理,比如:实现一共专门用来进行小于比较的函数模板
第三种情况就是变成了指针的比较,但是我们需要的是指向内容的比较
2.2函数模板特化
函数模板特化步骤
1.必须先有一共基础的函数模板
2.关键字template后面接一对空的尖括号<>
3.函数名后面跟一对尖括号,尖括号种指定需要特化的类型
4.函数形参表:必须要和模板函数的基础参数类型完全相同(包括const和引用),不同的编译器容易报不同的错误
意思就是当遇到date*时,自动进入这个流程,实现函数的特化
const的修饰是就近原则
这样写会报错的原因是,下面的特化中,const修饰的是指针,意思是你无法改变指向,只有将const提到&前面才能实现想表达的意思,才能和上面的参数意义完全相同
2.3类模板的特化
2.3.1全特化
全特化即是将模板参数列表中所有的参数都确定化
2.3.1偏特化
偏特化是针对任何模板参数进一步进行条件限制的特化版本
3.模板的分离编译
3.1什么是分离编译
一个程序由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式
因为编译器原因,到第四步时,如果被链接的函数没有进行实例化最后就会编译错误
所以需要显示实例化
除了这个办法外还可以直接在.h文件里面定义
4.总结
模板的优点:
1.模板复用了代码,节省资源,更快的迭代开发,C++(STL)标准库因此而产生
2.增强了代码的灵活性
模板的缺点:
1.模板会导致代码膨胀的问题,也会导致编译时间变长
2.出现模板编译错误时,报错信息非常凌乱,不容易发现报错