模板特化与分离编译
一、非类型模板参数
模板参数分类类型形参与非类型形参
类型形参即:出现再模板参数列表中,跟在 class 或者 typename 之类的参数类型名称
非类型形参:就是用一个常量作为类(函数)模板的一个参数,再类(函数)模板中可将该参数当成常量来使用。
当我们想定义以一个模板数组,但是不确定其长度时,我们只能以这种方式进行定义:

此时便暴露出其问题,关于数组的长度设定,我们没有办法设置其符合泛型编程的特点。
所以我们引入非类型模板参数的写法,就可以解决该问题。如下:

两者的区别:

这样,关于该成员变量数组的长度就可以由用户主动设置长度了。
注意:
1.浮点数、类对象以及字符串是不允许作为非类型模板参数的。
2.非类型的模板参数必须在编译期就能确认结果。
1.1 STL中的 array
以上我们的举例,其实在 STL 中便有其原型 : array的介绍,其实原理就是按照我们上面的非类型模板参数来实现的。

其本质就是一个容器数组。
使用区别:

可能大家感觉这定义这么相似,两者间没有太大任何区别。
array本质上是一个容器,是使用对象定义的。
而 数组本质就是指针
既然 C++11 带来了 array ,就说明其必然是有优势所在。
优势在于:
array中,不管越界写、越界读都会被检查到。其对越界的检查非常严格
本质上,array 对越界的检查是通过函数的调用来检查,而数组本质上是指针解引用,报错、奔溃与否与编译器有很大关系。编译器检查越界是采用抽查的方式,而且只针对越界写入,越界读不检查。
二、模板的特化
2.1 概念
通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会

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

被折叠的 条评论
为什么被折叠?



