函数模板
函数模板可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。
声明方法:
template <typename 标识符>
函数声明。
例子:
#include<iostream>
using namespace std;
template<typename T>//T 是模板参数
T abs(T x)
{ return x<0?-x:x; }
int main()
{ int n=-5;
double d=-5.5;
cout<<abs(n)<<endl;
cout<<abs(d)<<endl;
}
作用
使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。
函数模板的实例化
大致分为三种三种:1.隐式实例化。 2.显式实例化。 3.显示具体化。
显式实例化:
声明格式:
template
类型说明符 函数名 <类型说明符>(参数列表)
<>中的类型说明符 是指定抽象数据类型实例化后的确切数据类型。
(也可以不声明 ,而是在调用时在函数名后用<类型说明符>指定抽象数据类型实例化后的确切数据类型也可)一般用在运算多个数据类型时
如上面的代码可以这样调用
abs<int>(n);
函数模板的显示具体化(用于无法进行正常计算时,如指针加减)
声明格式:
template <>
类型说明符 函数名 <类型说明符>(参数列表)
必须重新定义函数模板
函数版本的选择
1.普通函数:
例子:
int add(int x,int y)
{
return x+y;
}
2.函数模板:
template <typename T>
T add(T x,T y)
{
return x+y;
}
3.函数模板的显示具体化:
template <>
int * add<int *>(int *x,int * y);
基本规则
1.非模板函数优先与模板函数。
2.函数模板中的显式具体化优先于隐式实例化。
3.转化少,更具体的函数模板优先。