C++模板,模板具体化,特例化
来源:互联网 发布:尼尔森数据分析报告 编辑:程序博客网 时间:2024/06/06 03:18
1.模板重载原则
函数同名(重载)时,调用优先级通常为:普通函数 >显式具体化(template specilazation)>显式实例化>一般模版函数
但更一般而言,有两条规则:
1>如果各自函数形参和调用处的实参 并非精确匹配,则会优先选择不需要转换的;
比如
void func(string str);
template void func(T*);
….func(“abcd”);//普通函数是string,而形参是一个是c类型字符串(数组);所以此处调用模板函数
2>对于普通的使用范围更大,和更特例化适用范围更小的情况
//一般模板函数用的隐式实例化,编译器根据使用的参数而生成相应类型的模板函数实例
template
void mSwap(T &t1,T &t2){
T temp=t1;
t1=t2;
t2=temp;
cout<<”Here are template version “<
2.显式具体化(template specilazation)>显式实例化
2.1.explicit instantiation显式实例化:指定类型生成相应类型的模板函数实例
显式实例化,只是实例化声明 ;因为实例化就是在已有模板的前提下,往里面灌料,任何料,塑料,铁水,等等,灌一个就是一个具体的模型。
template void mSwap(int &m1,int &m2)// 注意template后没有<>;
以上是定义;只能有一次定义,但在诸如mSwap(3,2)的使用前,必须声明:
template void mSwap(int &m1, int &m2);
2.2.explicit specialization 显式具体化/特化/特例化(不仅实例化声明,而且实现也变了):对特定类型的需要专门编写的模板函数实例。
//只想交换类的某个成员的话,则可以用显式具体化;如果使用普通模板,则会直接交换两个man类。
//由于显式具体化的高优先级(模板函数中最高),可以避免被其他函数调用。
//需要提供新的函数体。
//为了特例化,必须在作用域中有原来的模板声明;
//使用特例化前,特例化版本的声明必须在此作用域中,否则可能使用的是原来的模板
//所以:原来统一模板放在特例化模板声明前面,并且都包含在同一个头文件中。否则有的编译器会出现报错。
template<>//<>表示我们将为所有模板参数提供实参
void mSwap(man &m1,man &m2){//和普通函数没有什么区别,一切为了模板重载。。。
int temp=m1.getData();
m1.setData(m2.getData());
m2.setData(temp);
cout<<”Here are the man version,successed!”<
2.3 类模板部分特例化(部分特例化只能用于类模板,不能用于函数模板)
template//原模板
class A{…};
//部分特例化模板:
template
class A
reference
http://blog.sina.com.cn/s/blog_612ec26f0102w2wg.html
http://blog.sina.com.cn/s/blog_612ec26f0102w2wg.html
- C++模板,模板具体化,特例化
- C++Primer学习:模板特例化
- C++模板特例化
- C++ 模板特例化
- C++模板,特例化
- 模板特例化
- 模板特例化
- C++模板特例化
- C++函数模板 模板实例化、具体化
- C++函数模板 模板实例化、具体化
- C++函数模板 模板实例化、具体化
- C++函数模板 模板实例化、具体化
- C++函数模板 模板实例化、具体化
- C++函数模板 模板实例化、具体化
- C++_模板的实例化与具体化。
- 模板类特例化,模板函数特例化
- c++类模板特例化
- 模板特例化,偏特化
- eclipse 中安装activiti插件
- 【洛谷2024】食物链 并查集
- 【量化小讲堂-Python&Pandas系列07】数据告诉你:惊人的海龟交易法则
- 不修复软件缺陷的原因
- jquery获取自身元素的html
- C++模板,模板具体化,特例化
- 创建一个项目--[Angular入门]
- 6.4
- 童贞的过往——IT
- 数据库查询语句易错例题整理
- Mybatis学习笔记(十五)【查询缓存之一级缓存】
- 学习shell脚本语言之注意点
- HDU-6237:A Simple Stone Game(数论)
- 现实版钢铁侠