1.函数模板的定义:
下例中建立了一个交换两个数的函数模板:
template <typename T> //也可以用template <class T> 这里T可以改成其他任意名字
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
2.函数模板的演示实例:
#include <iostream>
using namespace std;
template <typename T> //或者 template <class T>
void Swap(T &a, T &b);
int main()
{
int i = 10, j = 20;
cout << "i = " << i << ", j = " << j << endl;
Swap(i, j);
cout << "Now i = " << i << ", j = " << j << endl;
cout << endl;
double m = 10.2, n = 12.1;
cout << "m = " << m << ", n = " << n << endl;
Swap(m, n);
cout << "Now m = " << m << ", n = " << n << endl;
return 0;
}
template <typename T> //或者 template <class T>
void Swap(T &a, T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
运行结果:
3.模板的重载
模板的重载,就是定义一个模板,然后可以在这个模板里面定义不同的参数类型或者参数个数
实例:
#include <iostream>
using namespace std;
const int size = 8;
template <typename T>
void Swap(T &a, T &b); //这个模板交换两个数字
template <typename T>
void Swap(T a[], T b[], int n); //这个模板交换两个数组中的元素
void show(int a[], int n);
int main()
{
int i = 10, j = 20;
int d1[size] = {0,7,0,4,1,7,7,6};
int d2[size] = {0,7,2,0,1,9,6,9};
cout << "i, j = " << i << j << endl;
cout << "Using compiler-generated int swapper: " << endl;
Swap(i, j);
cout << "Now i, j = " << i << ", " << j << endl;
cout << "Original arrays: " << endl;
show(d1, size);
show(d2, size);
cout << "Swapped arrays: " << endl;
Swap(d1, d2, size);
show(d1, size);
show(d2, size);
return 0;
}
template <typename T>
void Swap(T &a, T &b) //交换两个数字
{
T temp;
temp = a;
a = b;
b = temp;
}
template <typename T>
void Swap(T a[], T b[], int n) //交换两个数组中的各个数字
{
T temp;
for(int i = 0; i < n; i++)
{
temp = a[i];
a[i] = b[i];
b[i] = temp;
}
}
void show(int a[], int n)
{
cout << a[0] << a[1] << "/";
cout << a[2] << a[3] << "/";
for(int i = 4; i < n; i++)
cout << a[i];
cout << endl;
}
运行结果:
4.显示具体化
①问:为什么要用显示具体化?
答:假如定义了如下结构体
struct job
{
char name[30];
double salary;
int floor;
};
定义了两个job变量job1,job2,想交换job1和job2的所有信息(name,salary,floor),则直接用上例中的Swap是可以进行交换的;但是如果只想交换job1和job2信息的一部分,则直接用上述的Swap函数是不行的,需要用到显示具体化。
②显示具体化的定义:
template<> void Swap<job>(job &a, job &b) //显示具体化定义
{
double temp1;
temp1 = a.salary;
a.salary = b.salary;
b.salary = temp1;
int temp2;
temp2 = a.floor;
a.floor = b.floor;
b.floor = temp2;
}
③如果在一段程序中,同时有多个原型,则编译器在选择原型时,优先级如下:非模板函数 > 显示具体化 > 模板函数。即如果在程序中出现了三个Swap函数,则优先调用非模板定义的Swap函数,若没有非模板定义的Swap函数,则调用显示具体化的Swap函数,若前两者都没有,则调用模板函数定义的Swap函数。
④显示具体化的实例:
/***演示如何使用函数模板及显示具体化 ***/
/***定义了一个模板函数,以及一个显示具体化***/
#include <iostream>
using namespace std;
template<typename T>
void Swap(T &a, T &b); //函数模板申明
struct job
{
char name[30];
double salary;
int floor;
};
template<> void Swap<job>(job &a, job &b); //显示具体化申明
void show(const job a); //常规函数申明
int main()
{
int i = 10, j = 20;
job sue = {"zhangfei", 10000.0, 2};
job sidney = {"liubei", 12000.0,1};
cout << "Original:" << endl;
cout << "i, j = " << i << ", " << j << endl;
cout << "Swapped: " << endl;
Swap(i, j); //调用函数模板
cout << "Now i, j = " << i << ", " << j << endl << endl;
cout << "Before job swapping: " << endl;
show(sue);
show(sidney); //调用普通函数
cout << "After job swapping: " << endl;
Swap(sue, sidney); //调用显示具体化
show(sue);
show(sidney);
return 0;
}
template<typename T>
void Swap(T &a, T &b) //函数模板定义
{
T temp;
temp = a;
a = b;
b =temp;
}
template<> void Swap<job>(job &a, job &b) //显示具体化定义,交换salary 和 floor
{
double temp1;
temp1 = a.salary;
a.salary = b.salary;
b.salary = temp1;
int temp2;
temp2 = a.floor;
a.floor = b.floor;
b.floor = temp2;
}
void show(const job a) //常规函数定义
{
cout << "Name: " << a.name << endl;
cout << "Salary: " << a.salary << endl;
cout << "Floor: " << a.floor << endl << endl;
}
运行结果: