一、函数模版
函数模板不是一个实在的函数,编译器不能为其生成可执行代码。定义函数模板后只是一个对函数功能框架的描述,当它具体执行时,将根据传递的实际参数决定其功能。
函数模板类型自推:能够根据参数类型自动推演出模板类型参数。
1、语法格式
template<类型形式参数表>
返回类型 函数名(形式参数表)
{ }
2、函数模板的实例化
编译时期根据模板调用的类型方式,自动生成一份对应于该类型的代码
1)显示实例化:显示实例化也称为外部实例化。在不发生函数调用的时候将函数模板实例化,或者在不使用类模板的时候将类模板实例化称之为模板显示实例化。
2)隐式实例化:函数模板隐式实例化指的是在发生函数调用的时候,如果没有发现相匹配的函数存在,编译器就会寻找同名函数模板,如果可以成功进行参数类型推演,就对函数模板进行实例化。
隐式实例化:
//函数模板
template<typename T>
bool compare(const T a,const T b)
{
cout << "bool compare(T a, T b) " << typeid(T).name() << endl;
return a > b;
}
int main()
{
//隐式实例化
compare(3,4);
return 0;
}
显式实例化:
template<typename T>
bool compare(const T a,const T b)
{
cout << "bool compare(T a, T b) " << typeid(T).name() << endl;
return a > b;
}
//显示实例化
template void compare<int>(const int&,const int&);
3、函数模版的特例化
特例化是实例化一个模板,而非重载它。特例化不影响参数匹配。参数匹配都以最佳匹配为原则。
格式:
tem