目录
1、什么是函数模板
模板函数不是实际存在的函数,编译器不能为其生成可执行的代码。它只是一个用于生成函数定义的方案,只有在实际使用时,才能创建具体的实例函数(模板函数)。
#include <iostream>
template <typename T>
void fun(T a, T b) //函数模板
{
cout << a << " " << b << endl;
}
int main()
{
int a = 1;
int b = 2;
fun<int>(a, b);
system("pause");
}
2、函数模板的隐式实例化
(1)它是在函数调用时,根据参数的具体类型来确定函数模板中的泛型类型生成实例。
int a = 1;
int b = 2;
fun(a, b); //通过判断a,b的类型,产生对应的模板函数实例称为隐式实例化。
3、函数模板的显示实例化
(1)提前声明具体的实例。
template void fun<int>(int& , int& );
(2)在泛型中指出实例对象
fun<int>(a, b);
4、函数模板的显示具体化
(1)对于某些特殊类型,可能不适合模板实现,需要重新定义实现,此时可以使用显示具体化。
(2)显示具体化的原型和定义应以template<>开头,并通过名称指出具体化类型。
(3)对于给定的函数名,可以有非模板函数,模板函数和显示具体化函数以及它们的重载版本。
(4)非模板函数优先于具体化模板函数,具体化模板函数优先于模板函数。
template<> void fun<double>(double a, double b) //= template<> void fun(double a, double b)
{
cout << "<double> " << a - b << endl;
}
5、函数模板的实例化与具体化的区别
(1)显示实例化
template void fun<int>(int& , int& );
(2)显示具体化
template<> void fun<double>(double a, double b);
template<> void fun(double a, double b);
显示实例化是提前创建该类型的实例模板函数,而显示具体化是函数模板内的功能不适合该类型,需要重新定义。
6、测试程序
#include <iostream>
using namespace std;
template <typename T>
void fun(T a, T b) //函数模板
{
cout << a << " " << b << endl;
}
//显示具体化
template<> void fun<double>(double a, double b) //= template<> void fun(double a, double b)
{
cout << "<double> " << a - b << endl;
}
//显示实例化
template void fun<int>(int&, int&);
int main()
{
int a = 1;
int b = 2;
//fun(a, b); //不能与a,b类型的显示实例化共存
short c = 0;
short d = 0;
fun(c, d);
fun<int>(a, b);
fun<double>(7.2, 3.6);
system("pause");
}
输出:
0 0
1 2
<double> 3.6