1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码。定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能。
2:函数模板定义的一般形式如下:
template <类型形式参数> 返回类型 函数名(形式参数表)
{
...//函数实现
}
其中template为关键字,表示定义一个模板,尖括号“<>”中为模板参数,模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数。上述代码中定义的模板使用的是模板类型参数,模板类型参数使用关键字class或typedef开始,其后是一个用户自定义的合法标识符。模板非类型参数和普通参数定义相同,通常为一个常数。
可以将声明函数模板分成template部分和函数名部分。例如:
template <class T>
void fun(T t)
{
...//函数实现
}
例如,下面的代码定义了一个求和的函数模板:
template <class type>//定义一个模板类型
type Sum(type xvar,type yvar)
{
return xvar+yvar;
}
在定义完函数模板之后,需要在程序中调用函数模板。下面的代码演示了Sum函数模板的调用。
int iret=Sum(10,20);//实现两个整数的相加
double dret=Sum(10,20.5);//实现两个实数的相加
如果采用如下的形式调用Sum函数模板,将会出现错误。
int iret=Sum(10.5,20);//错误的调用
double dret=Sum(10,20.5);//错误的调用
上述代码中为函数模板传递了两个类型不同的参数。导致编译器产生了歧义。如果在调用函数模板时显示表示模板类型就不会出现错误。例如:
int iret=Sum<int>(10.5,20);//正确地调用函数模板
double dret=Sum<double>(10,20.5);//正确地调用函数模板
用函数模板生成实际可执行的函数又称为模板函数。函数模板与模板函数不是一个概念。从本质上讲,函数模板是一个“框架”,它不是真正可以编译生成代码的程序,而模板函数是把函数模板中的类型参数实例化后生成的函数,它和普通函数本质上是相同的,可以生成可执行代码。
3:函数模板的作用