当使用结构体来作为形参给另一个结构体赋值时,只想实现部分结构体内容的参数改变,而不改变所有参数。则可以使用显示具体化。
对于给定的函数名,可以有非模板函数、模板函数和显示具体化模板函数以及它们的重载模板。
显示具体化的原型和定义应以template<>开头,并通过名称来指出类型。
具体化优先于常规模板,而非模板函数优先于具体化和常规模板。
下面是用于交换job结构的非模板函数、模板函数和具体化的原型:
//非模板函数原型
void swap(job &,job &);
//模板原型
template<typename T>
void swap(T &,T&);
//显示具体化
template<>void swap<job>(job &,job &);
demo示例:
#include <QCoreApplication>
#include<QDebug>
#include<vector>
#include<iostream>
using namespace std;
template<typename T>
void swapData(T& a,T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
struct job
{
char name[40];
double salary;
int floor;
};
//显示具体化
template<>void swapData<job>(job &j1,job &j2)
{
double t1;
int t2;
t1 = j1.salary;
j1.salary = j2.salary;
j2.salary = t1;
t2 = j1.floor;
j1.floor = j2.floor;
j2.floor = t2;
}
void show(job &j)
{
cout<<"name: "<<j.name<<" salary: "<<j.salary<<" floor: "<<j.floor<<endl;
}
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
int i = 10,j=20;
swapData(i,j);
cout<<"\n";
job sue = {"su",7000,2};
job alice = {"alice",12121,3};
show(sue);
show(alice);
swapData(sue,alice);
cout<<"after switch ....";
show(sue);
show(alice);
return a.exec();
}