模板进阶

非类型模板参数(常量参数)

相当于向类传递常量(编译前确定)参数

只能传整型/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++中 一切均可{}初始化,且可省略=

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值