一、概念和定义
函数模板使用泛型来定义函数,其中的泛型可用具体的类型(如int 和double替换)。通过将类型作为参数传递给模板,可以使编译器生成该类型的函数。
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;
}
}
三、实例化和具体化
1、隐式实例化(implicit instantiation)
int i = 5, j = 6;
函数调用Swap(i,j)导致编译器生成一个Swap()的实例,该实例使用int 类型。模板并非函数定义,但使用int的模板实例是函数定义,称为隐式实例化
2、显示实例化(explicit instantiation)
template void Swap<int>(int, int);
直接命令编译器创建特定的实例(用int 实例化 T),不需要其他操作。
3、显示具体化 (explicit specialization)
template <> void Swap<int>(int &,int &);
声明的意思是,不要使用Swap()模板来生成函数定义,而应使用专门为int类型显示地定义的函数定义,一般在声明之后会有函数定义
显示具体化声明在关键字template后包含<>,而显示实例化没有,并且它们的含义和用法也有区别。
在最近的实习中用到,感觉函数模板还是很方便的,所以自己整理了一下。