程序演示:
#include <iostream>
struct job
{
char name[40];
double salary;
int floor;
};
//swap()模板原型
template <typename T>
void Swap(T &a, T &b);
//模板的显式实例化,使用double结合模板去创建一个函数定义
template void Swap<double>(double &, double &);
// 显式具体化的原型声明如下
template <>
void Swap<job>(job &j1, job &j2);
//普通的函数声明
void Show(job &j);
int main()
{
using namespace std;
//此时函数使用模板原型,也即隐式实例化
int x = 5, y = 6;
Swap(x, y);
cout << "x = " << x << "\t\t"
<< "y = " << y << endl;
//此时是显式实例化的应用,函数在第12行编译时,已经创建了一个函数定义
//这里类似于函数调用
double m = 3.44, n = 8.99;
Swap(m, n);
cout << "m = " << m << "\t"
<< "n = " << n << endl;
//此时是显式具体化的应用
job sue = {"Susan Yaffee", 73000.60, 7};
job sidney = {"Sidney Taffee", 78060.72, 9};
Swap(sue, sidney);
Show(sue);
Show(sidney);
return 0;
}
// Swap()模板定义---提供了一种函数定义方案
template <typename T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
// Swap()显式具体化---不使用模板函数,它自己就带有一套函数定义方案,
//且规定了数据类型,比如这里的'job结构'
template <>
void Swap<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)
{
std::cout << j.name << ":$" << j.salary
<< " on floor " << j.floor << std::endl;
}
程序编译运行结果如下:
x = 6 y = 5
m = 8.99 n = 3.44
Susan Yaffee:$78060.7 on floor 9
Sidney Taffee:$73000.6 on floor 7