函数模板二
来源:互联网 发布:月经半个月不干净知乎 编辑:程序博客网 时间:2024/06/05 10:27
1. 显示具体化
接上文,假设定义了结构:
struct job{ char name[40]; double salary; int floor;}
当想交换两个结构的内容时,使用交换两个值的常规模板Swap是可以的,但是,想交换结构的部分成员,比如,salary或floor,则需要使用不同的代码,但是Swap()的参数保持不变(两个结构的引用),因此无法使用模板重载来提供其他代码。
在这里,提供了一种方法,即提供一个具体化函数定义—称为显示具体化,其中包含所需的代码。当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板。
1.1 具体化的方法
对于给定的函数名,可以有非模板函数,模板函数和显示模板函数以及他们的重载版本
显示具体化的原型和定义应以 template<> 打头,并通过名称来指出类型。
具体化优于常规模板,非模板优于具体化模板
下面是交换两个结构的非模板函数,模板函数,显示具体化模板函数原型
//非模板函数void Swap(job &,job &);//模板函数template <typename T>void Swap(T &,T &);//显示具体化模板函数template<> void Swap<job>(job &,job &); // 或者是写成:template<> void Swap(job &,job &);
例如下面程序,由前程序修改而成:
#include <iostream>using namespace std;const int MaxNum=4;struct job { char name[40]; double salary; int floor;};template<typename T>//模板原型void Swap(T &a,T &b);template<>void Swap<job>(job &,job &);//显示具体化模板原型template<typename T>void Swap(T a[],T b[], int n);template<typename T>void show(T a[],int n);int main(){ int a=12,b=34; cout<<"Original,a,b= "<<a<<","<<b<<endl; Swap(a,b); cout<<"Now,a,b= "<<a<<","<<b<<endl; double c=12.0,d=34.12; cout<<"Original,c,d= "<<c<<","<<d<<endl; Swap(c,d); cout<<"Now,c,d= "<<c<<","<<d<<endl; int arr1[MaxNum]={1,2,3,4}; int arr2[MaxNum]={5,6,7,8}; cout<<"Original, arr1数组元素有: "<<endl; show(arr1,MaxNum); cout<<"Original, arr2数组元素有: "<<endl; show(arr2,MaxNum); Swap(arr1,arr2,MaxNum); cout<<"Now, arr1数组元素有: "<<endl; show(arr1,MaxNum); cout<<"Now, arr2数组元素有: "<<endl; show(arr2,MaxNum); job sue={"sue",23000,5}; job das={"das",13490.55,3}; cout<<"交换两个结构的部分元素 "<<endl; Swap(sue,das); cout<<"交换后两个结构的部分元素 "<<endl; cout<<"sue.salary="<<sue.salary<<","<<"sue.floor="<<sue.floor<<endl; cout<<"das.salary="<<das.salary<<","<<"das.floor="<<das.floor<<endl; return 0;} template<typename T>//模板定义void Swap(T &a,T &b){ T temp; temp=a; a=b; b=temp;}template<>void Swap<job>(job &j1,job &j2){ double d; int i; d=j1.salary; j1.salary=j2.salary; j2.salary=d; i=j1.floor; j1.floor=j2.floor; j2.floor=i;}template<typename T>void Swap(T a[],T b[], int n){ for (int i=0;i<n;i++) { T temp; temp=a[i]; a[i]=b[i]; b[i]=temp; }}template<typename T>void show(T a[],int n){ for (int i=0;i<n;i++) { cout<<"数组的第"<<i+1<<"个元素:"<<a[i]<<endl; }}
输出:
2. 实例化和具体化
如何理解术语实例化和具体化,编译器使用模板为特定类型生成函数定义时,得到的是模板实例。比如,调用Swap( i , j )导致编译器生成Swap的一个实例,该实例使用int类型。模板并非函数定义,但使用int的函数模板实例是函数定义。这种实例化方式叫做隐式实例化。c++允许显式实例化,格式如下:
Template void Swap<int>(int,int);
该声明的意思是:使用Swap( )模板生成int类型的函数定义。
与显时实例化不同的是,显式具体化使用下面方式声明:
Template<> void Swap<int>(int &,int &);//或者Template<> void Swap(int &,int &);
该声明的意思是:不要使用Swap( )模板来生成函数定义,而应使用专门为int类型显式地定义的函数定义。
阅读全文
0 0
- 函数模板(二)
- 函数模板二
- C++模板(二):函数模板和模板函数
- 函数模板、类模板学习二
- 模板之泛化仿函数(二)
- 【C++基础】C++函数模板(二)
- C++之函数模板详解(二)
- ACM 母函数模板 详解 + 理解!(母函数二)
- 面向对象程序设计上机练习二(函数模板)(C++函数模板)
- 【函数模板】面向对象程序设计上机练习二(函数模板)
- 【C++ 函数模板】SDUT-1141 面向对象程序设计上机练习二(函数模板)
- 模板(二)
- sdut 面向对象程序设计上机练习二(函数模板)
- 【1141】面向对象程序设计上机练习二(函数模板)
- 面向对象程序设计上机练习二(函数模板)
- 面向对象程序设计上机练习二(函数模板)
- 面向对象程序设计上机练习二(函数模板)
- 面向对象程序设计上机练习二(函数模板)
- Linux服务器删除乱码文件和文件夹的方法
- Java 并发 竞态条件
- vue.js学习笔记2
- C和Cpp两大重点
- 解决报错:org/springframework/util/backoff/BackOff
- 函数模板二
- 乐观锁的一种实现方式——CAS
- dev ChartControl的最全使用方法 有横轴纵轴高亮显示
- 如何理解JS中的call及apply
- 命令模式
- Mysql中文乱码问题,忘记在建表时设置字符类型
- 熔断监控Hystrix Dashboard和Turbine
- java基础之数组
- STL之nth_element