泛型编程中三大模板类型(类模板、函数模板、成员模板)的应用—HJ-record10
目录
function template与class template(函数模板与类模板)
namespace的经验之谈
namespace的主要作用,就是把一些东西给区隔出来,因为现在设计软件的过程中,是团队作业,有可能两个部门所独立开发出来的函数中,变量的名称重合,那么当把多个部门的函数整合到一起的时候,会发现变量重名冲突或这串名,导致报错。
所以,namespace就是将你取一个名字,把你用的所有的变量名给包起来,我也取一个名字,把我用的所有的变量名给包起来,这样我们用的时候,都是在各自的namespace下使用的名称,就不会出现串名或者冲突了。
举个例子,比如我现在需要测试20个程序的效果,我不可能去开20个项目,去逐个的测试,这样就太Low了,我会,开一个Main函数,然后为这20个代码去编写对应的测试函数,并把其都放进去,每个函数标明在清楚对应的命名域中(自己取个名字),如下:
这样就保证了,每个检验程序之间是完全的没有牵连,不会受到影响。
function template与class template(函数模板与类模板)
函数模板比类模板更好用!而且,函数模板和类模板都是解决的同样的问题,多说无益,对比一下效果就知道了!下面是函数模板,标黄的部分是使用时候的语法:
下面是普通的类模板:
从调用层面上看,函数模板在使用的时候,不必指明type,直接可以根据调用的值来,推出来要进行的类型就可以了,后面就可以当成普通的类来用而类模板还需要在调用的时候专门声明一下所要使用的类。
模板块本身可以编译通过,但其实模板块也是个半成品,因为其在跟其他程序一块使用的是不知道后头到底能不能通过的,因此当跟其他程序在一起使用的时候,还需要再编译一次,保证能不能通过。
就拿上面的例子来说,min操作的本身模板块定义是没问题的,但如果传进去一个stone类型,那模板块就蒙了,没见过stone类型就,就会报错,除非把min模板中的"<"、"?"、":"进行操作符重载,让其知道遇到stone类型该怎么处理。
member template(成员模板)
上面的标黄部分就是成员模板,标黄的这一块是模板中的一个成员,而这个成员本身呢,也是一个模板。这种方式的应用场景就是,万一当外头的这个模板是一个允许变化的东西,而且,在这种变化之下,里面的T1、T2是被确定了之后,里面的这一小段(U1、U2)又可以被允许变化,往往这种成员模板会出现在标准库中,很多很多的模板,其构造函数,就会设计成一个成员模板,下面举个例子,
上图中,设计了四个class(鱼类、鲫鱼、鸟类、麻雀),里头什么都不必做,就是为了看它们的继承关系,那么上面的T1、T2,来制造一个鲫鱼和麻雀,下面的Base1和Base2也做成一对(鱼类,鸟类),那么再继续下看,可不可以将鲫鱼和麻雀作为初值塞到鱼类和鸟类构成的pair里面?当然是可以的,但反过来是不行的,为了满足这种可以与不可以,设计pair的人,会允许放任意类型的T1和T2,并且在构造我的这个类的时候,可以另外指定其他类型的U1和U2,但必须满足构造函数中的条件(把初值的头尾转化为整个类的头尾)。这就是成员模板所经常用到的一个场景,这么做的目的是为了让构造函数更有弹性。
换个例子,如果以鲸鱼和麻雀作为初值取初始化鱼类和鸟类,运行是不可以被通过的,因为鲸鱼不是鱼类。