java井字棋游戏的uml图_c++ 显示具体化和显示实例化

今天看到c++ primer plus 第8章--函数探幽,其中模版函数一节有2个比较容易搞混的概念: 在此记录以下:​

56e8cf0fb6d3d2979aae674c0460b3fd.png

先看模版函数的定义:个人认为主要是为了节约代码量,对不同的类型完成相同的操作,如果使用函数重载的话,对于基本数据类型整形,就有short/int/long/longlong 4种,还不包括unsigned和signed,因此需要大量的重载函数,而内容都是雷同的,浪费复制粘帖的操作。因此采用模版函数来实现。​

1、使用 template 或​ template 放到函数开头来声明模版。其中typename是新标准,class是为了向前兼容。因此写class较为通用。

​2、注意模版不能缩短可执行文件长度,在函数调用时,必须依据给出的参数类型由编译器生成实例化的模版函数(称作隐式实例化 instance),即 int add(int a, int b); 因此模版函数只是将程序员要做的事交给了编译器而已。

​3、模版可以重载,见上图的模版1和模版2、模版3,注意重载是用于改变输入参数类型或增加、减少输入参数个数(后者一般通过缺省参数实现!!)。

我们输入 add(1,2)得到3,并且显示调用模版1;输入 add(1,2,3) 得到6,调用模版2;输入​add(1,'A')得到'B',调用模版3; 注意模版3中多个类型的写法。

4、​模版的显示具体化(重点)

6d2ed73f4d80f7c0a146ab79f5dafca1.png

比如对于模版2而言,我们无法用其实现​ int*类型的加法,因此我们需要 specialize 这个模版,即对于int*型的输入特例化(具体化)这个模版,使其可以与原始模版不同的功能。注意显示具体化不能只声明,一定要有函数体才可以,否则vs会报链接错误!!!

我的理解是:显示具体化拓宽的模版的应用范围!原本add函数只能对重载了“+运算符”的类型使用,现在也可以对int 数组使用,但其实完全可以另写一个函数 add_array来实现这个功能,感觉就是为了好看(符合某种统一风格)所以写到一起!

​5、模版的显式实例化

模版的显式实例化其实只是一个声明:template int add(int,int); 注意​template后没有<>,而add后最好加上,即你自己要实例化的类型。

实际上对显式实例化的作用我也不很清楚,因为修改函数体的话使用具体化就可以了,实例化是不能带函数体的,因此参考http://bbs.csdn.net/topics/390559301,大概能得到结论:

cout<

​cout<

​cout<

此外​显式实例化还有一个作用:

根据《在同一文件中使用同类型的显示实例化和显示具体化会报错的特点》​,先声明显示实例化,则后面的显示具体化如果存在,会报错,从而防止具体化该型模版!!

​c++11中,好像可以先具体化,再实例化声明,不会报错

总结:​

调用优先级:普通函数>显式具体化>显式实例化>普通模版

显式实例化用于人为选择特定的类型!

显式具体化用于修改某类型的函数具体功能!​

​模版匹配的方式非常复杂!慎用不同参数个数的模版重载!,详见第六版 294页。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值