c++ - 第12节 - 模板进阶
创始人
2024-02-06 15:07:34

1.非类型模板参数

模板参数分为类型形参与非类型形参 类型形参(可以认为是虚拟类型):出现在模板参数列表中,跟在class或者typename之类的参数类型名称。 非类型形参(可以认为是常量):用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。 注: 1.模板的非类型形参可以认为是常量,在模板中不能被修改 2.浮点数、类对象以及字符串是不允许作为非类型模板参数的(非类型模板参数一般使用的都是整型,例如int、unsigned int、char) 3.非类型的模板参数必须在编译期就能确认结果 

容器array(c++11新增的容器)是一个固定大小的顺序容器,相当于定长数组。如下图所示,容器array类模板的官方库声明中,就有非类型模板参数N,N就是开辟array容器的元素个数。

array与vector相比:容器array的所有功能使用vector都可以实现。与vector有一点不同的是array里面存的就是全部的数据,数据全部存在栈里,而vector里面其实只有几个指针,vector里面的数据都存在堆里。实际中栈空间很小堆空间很大,所以vector更优。

array与原生数组相比:array其实就是封装过的原生数组,二者的区别是array对于越界的读写都可以检查出来(operator[ ]能严格检查越界),而原生数组是抽查不一定能检测出来。

总结:array对比原生数组还是有一些越界检查的优势的,但是实际中我们统一直接用vector更好。

如下图一所示代码定义一个静态栈,这样的代码有一个缺陷就是如果同时定义多个栈,这些栈的大小都是一样的。我们可以使用非类型模板参数来解决这个缺陷,灵活的控制每一个静态栈的大小。

  

2.模板的特化

2.1.概念

通常情况下,使用模板可以实现一些与类型无关的代码,但对于一些特殊类型的可能会得到一些错误的结果,需要特殊处理,如下图所示第一二个结果是我们所想的,但是第三个和我们预期的结果不同,其实第三个结果值是随机的,第三个这里比较的是p1和p2指针指向地址的大小,这里应该给Less函数传的是*p1和*p2,才是我们预期的结果。

但是如果一定要让你传p1和p2给Less函数,而且要实现预期的逻辑和结果,就需要用到模板的特化,即在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。模板特化中分为函数模板特化与类模板特化。

2.2.函数模板特化

函数模板的特化步骤: 1. 必须要先有一个基础的函数模板 2. 关键字template后面接一对空的尖括号<> 3. 函数名后跟一对尖括号,尖括号中指定需要特化的类型 4. 函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误  注:其实我们也可以直接写一个现成的Less函数,这个Less函数只负责处理Date*这种类型的,这样也是可以的,如下图所示,这里Less函数模板、Less函数模板特化、Less函数是可以同时存在的,Less(p1,p2)调用的是现成的Less函数。 总结: 1.函数模板基本不用特化方式处理,直接写一个具体类型的函数更好 2.虽然函数模板可以用上面的方式直接写一个现成的函数来处理,不需要进行特化,但是类模板不能去写一个类来处理,因为函数可以重载但是类不能重载。

2.3.类模板特化

2.3.1.全特化

全特化:将模板参数列表中所有的参数都确定化,如下图所示

注:上面的全特化版本的功能简单的说就是,只要Data模板第一个参数是int第二个参数是char就走我

2.3.2.偏特化

偏特化:任何针对模版参数进一步进行条件限制设计的特化版本。 偏特化有两种表现方式: 第一种:部分特化,将模板参数类表中的一部分参数特化,如下图所示。 注:上面的这种偏特化版本的功能简单的说就是,只要Data模板第二个参数是char就走我

第二种:参数更进一步的限制,偏特化并不仅仅是指特化部分参数,而是针对模板参数更进一步的条件限制所设计出来的一个特化版本,如下图所示。

注:

1.上面的第二种偏特化版本写了指针和引用两个版本,指针版本的功能简单的说就是,只要Data模板第一个参数是指针第二个参数是指针就走我,引用版本的功能简单的说就是,只要Data模板第一个参数是引用第二个参数是引用就走我

2.上面的d9是int*和int类型,所有的特化都不匹配,因此走的是原本的Data模板

2.3.3.类模板特化应用示例

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...