函数模板二

来源:互联网 发布:月经半个月不干净知乎 编辑:程序博客网 时间:2024/06/05 10:27

1. 显示具体化

接上文,假设定义了结构:

struct job{    char name[40];    double salary;    int floor;}

  当想交换两个结构的内容时,使用交换两个值的常规模板Swap是可以的,但是,想交换结构的部分成员,比如,salary或floor,则需要使用不同的代码,但是Swap()的参数保持不变(两个结构的引用),因此无法使用模板重载来提供其他代码。
  在这里,提供了一种方法,即提供一个具体化函数定义—称为显示具体化,其中包含所需的代码。当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板。
  

1.1 具体化的方法

  1. 对于给定的函数名,可以有非模板函数,模板函数和显示模板函数以及他们的重载版本

  2. 显示具体化的原型和定义应以 template<> 打头,并通过名称来指出类型。

  3. 具体化优于常规模板,非模板优于具体化模板

下面是交换两个结构的非模板函数,模板函数,显示具体化模板函数原型 

//非模板函数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类型显式地定义的函数定义。

原创粉丝点击