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的区别是什么? 总的来 ...
随机推荐
- 开始研究Ray tracing
几个月前面试时Boss问过我一个问题--"除了scanline渲染方法,你还知道什么其他渲染方式?",我没答出来,至今记忆犹新. 前段时间摆弄Intel VTune时看了它的示例代 ...
- Golang学习 - strconv 包
------------------------------------------------------------ // 将布尔值转换为字符串 true 或 false func FormatB ...
- win7系统中的声音图标不见了怎么办
转载:http://jingyan.baidu.com/article/dca1fa6f815023f1a44052d6.html 我以前用的比较多的还是xp系统,对xp系统中的一些常见的操作还是很方 ...
- C#基础--struct(结构体)
结构体和类有点类似 我们定义一个类的时候 是class 类名 定义结构体的时候是 struct 结构体名 结构体的写法 struct Point { // public int ...
- java对象创建过程
1.jvm找到class文件路径. 2.jvm载入class文件,静态初始化,创建一个class对象. 3.为即将创建的对象分配内存空间. 4.对分配的空间进行清零,例如:int清除为0,boolea ...
- 10. Android框架和工具之 AppMsg(消息提示)
1. AppMsg 优雅的弹出类似Toast的消息提示,支持3种状态Alert(警告),Confirm(确认)以及Info(消息). 2. AppMsg使用: (1)AppMsg下载地址 ...
- axure rp pro 6.5 注册码
发现一可用的注册码: Name:BEAN Serial:MZlb4FJwOVw+j04A4pX8S5genhcCOo1adsaH/ZHOukDY7OyPJcCKUHlwUEfU0Osr (已验证可用) ...
- spring事务管理出错。No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy ...
- 解决eclipse配置Tomcat时找不到server选项
集成Eclipse和Tomcat时找不到server选项: 按照网上的步骤如下: 在Eclipse中,窗口(window)——首选项(preferences)——服务器(Server)——运行时环境( ...
- jQuery选择器之子元素过滤选择器Demo
测试代码: 07-子元素过滤选择器.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...