这两天读到C++ Primer Plus第八章函数探幽部分,发现函数模板这里有一点点绕,因此写篇稿做下小结:
1.实例化
我们知道,声明一个函数模板后:
template<typename T>
void Swap(T&, T&)
{
T temp;
temp=a;
a=b;
b=temp;
}
在代码中并不会立刻生成函数,它只是一个用于生成函数定义的方案。
如果定义两个int型变量a,b
int a,b;
则调用Swap(a,b)时才会生成这个函数的实例,此时生成的函数实例为:
void Swap(int& a, int& b)
{
int temp;
temp=a;
a=b;
b=temp;
}
因为传入的两个参数为int型变量,这种靠传入参数由编译器自主判断生成函数实例的方式称为隐式实例化
这种方式很好理解,下面来谈谈显式实例化
见名知义,这种方式是直接告诉编译器要生成什么样的实例,有两种声明方法:
①:使用显式实例化声明:
template<typename T>
void Swap(T&, T&)
{
T temp;
temp=a;
a=b;
b=temp;
}
int main()
{
template void Swap<int>(int&,int&);
//.................
.......代码段........//
}
直接告诉编译器模板中的T为int类型。
(说实话,我不知道这种方式有什么用……不推荐使用)
②:在使用函数的时候直接创建显式实例化(推荐)
template<typename T>
T add(T a, T b)
{
return a+b;
}
int main()
{
double a=2.5;
double b=3.5;
cout<<"a+b="<<add