非类型模板参数(常量参数)
相当于向类传递常量(编译前确定)参数
只能传整型/size_t,不可double等
C++20 后可以支持其他内置类型(可指针)
自定义类型的实参永远不行
array
可理解为固定size的vector
array和普通数组区别
普通数组越界检查不严格,是抽查
越界调试时不报错
array无论读写或越界都能及时报错
没啥大用 不如vector
array在栈区开空间 占栈空间 不如在堆开
typename
typename告诉编译器 后为一个自定义类型 不是静态数据成员/变量
也可用auto 就不用typename了
对于模板,编译器只在实例化时检查实例化部分,未实例化时不检查模板,所以此时无法确认其为自定义类型/变量
typedef 给类型起别名 不给变量别名
给变量其别名用引用
模板的特化
特殊化处理
如对Date比较大小
参数类型为const的特化
建议:别用函数特化
类模板特化好用
类模板特化方式
偏特化
特化指针(不改变参数类型)
传入int* T为int
应用:
type(T1).name == int,而非指针
可保证类中既能T1*表示其指针类型,也能T表示其原类型
也可特化引用
模板分离编译
类和函数一般声明定义文件分离,声明在h中,定义在cpp中
只包了声明的h文件,为什么能用其定义的cpp
调用函数汇编层面转成 call 函数地址:在链接时拿函数名找函数地址
普通函数(的指令)会被编译生成地址(第一条指令地址),地址放到符号表,但模板不会被编译生成地址放到符号表
链接前文件间不交互:保证了文件编译效率
显示实例化
大坑
要实例化所有用到的实例
最佳解决方案:不要分离到两个文件
解决原理:调用的地方就有定义,直接实例化了
模板总结
tips:
C++中 一切均可{}初始化,且可省略=