一、函数模板的概念
函数模板是通用的函数描述,使用泛型来定义函数,其中的泛型可用具体的类型(如int, double)替换。通过将类型作为参数传递给模板, 可使编译器生成该类型的函数。由于模板允许以泛型的方式编写程序, 因此也被称为通用编程。由于类型是用参数表示的,因此模板特性也被称为参数化类型。
模板并不创建任何函数, 只是告诉编译器如何定义函数。
函数模板不能缩短可执行程序,最终生成的代码不包含任何模板,而只是包含了为程序生成的实际函数。使用模板的好处是,它使生成多个函数定义更简单,更可靠。
通常将模板放在头文件中,并在需要使用模板的文件中包含头文件。
二、函数模板的使用
1. 模板原型声明
template <typename T> //typename 是关键字 T 是模板名称
void Swap (T &a, T &b)
2. 建立一个模板
template <typename T> //建立一个模板,并将类型命名为T。
void Swap(T &a, T &b)
{
T temp;
temp=a;
a=b;
b=temp;
}
3. 具体参数类型传递
调用函数时, 将具体参数类型传递给编译器,由编译器生成该函数的int 类型的定义。
int i=10;
int j=20;
swap( i,j);
三、重载的模板
需要多个对不同类型使用同一种算法时可以使用模板。但是并非所有的类型都使用完全相同的算法,这时可使用重载模板。
template <typename T>
void Swap( T&a, T &b);
template <typename T>
void Swap( T *a, T *b, int n);
四、显示具体化( explicit specialization)
显示具体化是一个具体化函数定义,其中包含所需的代码,当编译器找到与函数调用匹配的具体化定义时,将使用该定义,而不再寻找模板。
1.c++98标准定义:
对于给定的函数名,可以有非模板函数,模板函数和显示具体化模板函数以及它们的重载函数。
显示具体化的原型和定义以template<>打头,并通过名称来指出类型。
优先级是:非模板 > 显示具体化 > 模板函数
2. 显示具体化定义
template <> void swap< int> (int &, int &)
template <> void swap (int &, int &) //简化版
五、具体化
1. 隐式实例化(implicit instantiation):在函数调用时编译器生成相应的一个实例。
template <typename T> //typename 是关键字 T 是模板名称
void Swap (T &a, T &b)
2. 显示实例化(explicit instantiation) :直接命令编译器创建创建特定的实例。
template void Swap <int> (int , int) //没有尖括号
3.显示具体化(explicit specialization):
template <> void swap< int> (int &, int &)