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

原创粉丝点击