template_12特化与重载
1,重载函数模板
f<int*>((int*)pi);//1
f<int>((int*)pi);//2
上面用int*替换第一个模板的T,用int来替换第二个模板的T。那么将得到两个相同参数类型(int*)的同名函数。
也就是不仅同名模板可以同时存在,它们各自具有相同参数类型和返回类型的实例化体也可以同时存在。
f(pi);对于这两个模板实参演绎都可以获得成功,即f<int*>(int*)和f<int>(int*).这也就意味着调用是二义性的。
但是,考虑重载解析的额外规则:选择"产生自更特殊的模板的函数"。因此选择了第二个模板。
当然如果要在两个特殊程度相同的模板中选择,将不能做出决定这是产生二义性。
模板函数也可以和非模板函数同事重载,会优先选择非模板函数。
2,签名

3,显式特化
类模板不能被重载,但可以使用另一种替换的机制来实现这种透明自定义模板功能,这就是显式特化,也称之为全局特化。
它为模板提供了一种使模板参数可以被全局替换的实现。
事实上类模版和函数模板都可以被全局替换,而且类模版的成员(成员函数,嵌入类,静态成员变量等)都能被全局替换。
全局特化和局部特化都没有引入一个全新的模板或模板实例,它们只是对原来的泛型(或非特化)模板中已经隐式声明的实例提供另一种定义。
template<> class S<特化的模板实参>
全局特化的实现并不需要与泛型实现有任何关联,可以包含不同名称的成员函数。全局特化只是和类模板的名称有关联。
4,全局类模板特化

对于特化的声明,因为它不是模板声明,所以应该使用(位于类外部)普通成员定义语法来定义全局类模板特化的成员,也就是不能指定template<>前缀。
全局模板特化和由模板生成的实例化版本不能共存于同一个程序中。
实例化置于全局模板特化位置之后,并且定义了全部模板特化,此时这个实例化其实是走的全局模板特化所以OK.
如果全局模板特化的编译单元与跟实例化或泛型声明的编译单元不在同一个编译单元,容易出现很难捕捉的错误。
我们需要确认特化的声明对泛型模板的所以用户都是可见的。
特化声明通常都应该位于模板声明之后。
然而泛型实现也可能来自外部资源包,我们可以创建一个包含泛型声明的头文件并让特化什么位于其后。
通常都应该避免让模板特化来自外部资源包。
5,全局函数模板特化
全局函数模板特化和类模板特化大体上是一致的,唯一区别是:函数模板特化引入了重载和实参演绎这两个概念。
全局特化声明的声明对象并不是一个模板,因此对于非内联的全局函数模板特化的声明而言,在同个程序中它的定义只能很粗线一次。
全局函数模板特化的声明必须紧跟在模板定义的后面,以避免使用一个模板直接生成的函数。
特化声明禁止模板进行实例化;
为了避免出现重复定义错误,就不能把定义放在头文件里。解决方案是把这个特化声明为内联函数,此时该函数的定义就可以放在头文件中。
6,全局成员特化

7,局部类模板特化

template_12特化与重载的更多相关文章
- C++普通函数与模板函数以及特化函数重载的优先级问题
在面对C++模板的时候,需要十分注意,因为模板的复杂性有很多情况,所以最好学习模板的方法我个人认为就是用到就去学,用不到就尽量别去看各种奇门怪技,因为你就算看了,好不容易搞懂模板的实现内部了,包括元编 ...
- C++—模板(2)类模板与其特化
我们以顺序表为例来说明,普通顺序表的定义如下: typedef int DataType; //typedef char DataType; class SeqList { private : Dat ...
- C++ template —— 模板特化(五)
本篇讲解模板特化-------------------------------------------------------------------------------------------- ...
- C++模板专门化与重载
最近在复习C++有关知识,又重新看<<Effective C++>>,收获颇丰.原来以前看这边书,好多地方都是浅尝辄止.<<Effective C++>> ...
- C++自问自答
1.为什么派生层次上的类,同一个虚函数在各个类的虚表中的位置一样? 因为:对虚函数的调用是通过虚指针+偏移地址构成,由于对虚函数的调用都是通过这种方式,所以对同一个虚函数的偏移值就必须 ...
- C++模板实例掌握
前段时间重新学习C++,主要看C++编程思想和C++设计新思维.对模版的使用有了更进一层的了解,特总结如下: 下面列出了模版的常用情况: << '\n';} //参考:http://ww ...
- 最优雅的C++跟lua交互.
我先来吐槽一下我们这个项目. 我是做手机游戏的, cocos2dx引擎, lua编码. 这本来是一件很欢快的事情, 因为不用接触C++. C++写久了的人写lua, 就会感觉任督二脉被打通了, 代码写 ...
- 读书笔记 effective c++ Item 25 实现一个不抛出异常的swap
1. swap如此重要 Swap是一个非常有趣的函数,最初作为STL的一部分来介绍,它已然变成了异常安全编程的中流砥柱(Item 29),也是在拷贝中应对自我赋值的一种普通机制(Item 11).Sw ...
- C++编程剖析 问题 方案 和设计准则
1.Set的每个对象为什么会有三个指针? STL中的set使用方法详细!!!! 因为其底层是红黑树实现的,每个节点有两个子节点和一个父节点,所以需要三个指针. Set 与 map的区别是什么? 总的来 ...
随机推荐
- MySQL中部分系统变量介绍
have_symlink DISABLED YES 用以支持在表定义中指 ...
- android学习日记14--网络通信
一.Android网络通信 android网络通信一般有三种:java.net.*(标准Java接口).org.apache接口(基于http协议)和android.net.*(Android网络接口 ...
- 简约之美Jodd-http--应用一箩筐
Jodd-http是一个微型的.简约的http client,然而简单而且方便.使用它可以轻松的实现发送请求和读取响应.它的目标就是日常应用变的非常简单,从而简化开发人员的工作. 了解Jodd-htt ...
- PHPDoc/PHPDocumentor生成API文档
PHPDocumentor是一个用PHP写的强大的文档自动生成工具,对于有规范注释的php程序,能够快速生成具有结构清晰.相互参照.索引等功能的API文档.旧版本是PHPDoc,PHPDoc是PEAR ...
- 基于ARM-LINUX的温度传感器驱动-DS18B20
转载:http://blog.csdn.net/ayangke/article/details/6883244 作者:冯建,华清远见嵌入式学院讲师. DS18B20数字温度传感器接线方便,封装成后可应 ...
- A标签使用javascript:伪协议
一.前言 今天,遇到一个别人挖的坑,问题是这样的. 做了一个列表页,可以筛选数据,有很多筛条件.主要是有input复选框和<a>标签两种.如图: 其中房价的筛选条件使用<a>标 ...
- javascript常见错误
初学Javascript,每天总是被很小的问题折磨半天,今晚就有好几个小问题. 第一:全部使用双引号造成匹配错误 <input type="checkbox" onmouse ...
- 【Android 界面效果37】ViewStub的应用
在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局.那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在 ...
- TQ210开发板NFS挂载android4.0.4的rootfs的方法
首先声明的是,我使用的u-boot是自己移植的u-boot2013.01.01而非天嵌官方的那个,至于使用官方的u-boot如何去实现nfs挂载rootfs我没怎么研究过,不过原理方法都是一致的. 主 ...
- 机房收费系统之处理流程图与DFD图
一直想把自己画的图拿出来与大家分享,不过说来惭愧,一是图还没画完,二是图画的确实不咋地, 对于机房收费系统还是感到混乱,图画的不好大家多多指正. 系统处理流程图: DFD图