【C++】模板特化、模板分离编译

本文详细介绍了C++中的非类型模板参数,通过STL中的array例子展示了其用途。接着,讨论了模板特化,包括全特化和偏特化,解释了何时及如何使用它们。文章还探讨了模板分离编译的问题,指出模板不支持常规的分离编译,并提供了处理此类问题的方法。最后,总结了模板的优缺点,强调其在代码复用和灵活性上的贡献,同时也提到了可能导致的代码膨胀和编译错误的挑战。

一、非类型模板参数

模板参数分类类型形参与非类型形参
类型形参即:出现再模板参数列表中,跟在 class 或者 typename 之类的参数类型名称
非类型形参:就是用一个常量作为类(函数)模板的一个参数,再类(函数)模板中可将该参数当成常量来使用。

当我们想定义以一个模板数组,但是不确定其长度时,我们只能以这种方式进行定义:
模板参数

此时便暴露出其问题,关于数组的长度设定,我们没有办法设置其符合泛型编程的特点。

所以我们引入非类型模板参数的写法,就可以解决该问题。如下:
非类型模板参数
两者的区别:
在这里插入图片描述

这样,关于该成员变量数组的长度就可以由用户主动设置长度了。

注意:
1.浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2.非类型的模板参数必须在编译期就能确认结果。

1.1 STL中的 array

以上我们的举例,其实在 STL 中便有其原型 : array的介绍,其实原理就是按照我们上面的非类型模板参数来实现的。
STL中的array
其本质就是一个容器数组。
使用区别:
在这里插入图片描述
可能大家感觉这定义这么相似,两者间没有太大任何区别。

array本质上是一个容器,是使用对象定义的。
而 数组本质就是指针

既然 C++11 带来了 array ,就说明其必然是有优势所在。
优势在于:

array中,不管越界写、越界读都会被检查到。其对越界的检查非常严格
本质上,array 对越界的检查是通过函数的调用来检查,而数组本质上是指针解引用,报错、奔溃与否与编译器有很大关系。编译器检查越界是采用抽查的方式,而且只针对越界写入,越界读不检查。

二、模板的特化

2.1 概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Brant_zero2022

素材免费分享不求打赏,只求关注

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值