函数模板
template<class类型参数1,class类型参数2,…>
返回值类型 模板名(形参表)
{
函数名
};
template<class T>
void Swap(T &x,T &y)
{
T tmp=x;
x=y;
y=tmp;
}
求数组最大元素的MaxElement函数模板
template<class T>
T MaxElement(T a[],int size)
{
T tepMax=a[0];
for(int i=1;i<size;++i)
if(tmpMax<a[i])
tmpMax=a[i];
return tmpMax;
}
不通过参数实例化函数模板
#include<iostream>
using namespace std;
template<class T>
T Inc(T n)
{
return 1+n;
}
int main()
{
cout<<Inc<double>(4)/2;//输出2.5
return 0;
}
函数模板的重载
函数模板可以重载,只要它们的形参表或类型参数表不同即可。
函数模板和函数的次序
在有参数完全匹配和函数模板名字相同的情况下,编译器如何处理一条函数调用语句
1.先找参数完全匹配的普通函数(非由模板实例化而得得函数)
2.再找参数完全匹配得模板函数。
3.再找是参数经过自动类型转化后能够匹配的普通函数。
4.上面的都找不到,则报错。
匹配模板函数时,不进行类型自动转换
类模板
template<typename类型参数1,typename类型参数2,…>
//类型参数表
class 类模板名
{
成员函数和成员变量
};
类模板示例:Pair类模板
template<class T1,class T2>
class Pair
{
public:
T1 key;
T2 value;
Pair(T1 k,T2 v):key(k),value(v) { };
boll operator<(const Pair<T1,T2>&p)const;
};
template<class T1,class T2>
boll Pair<T1,T2>::operator<(const Pair<T1,T2>&p)const
//Pair的成员函数 operator<
{
return key<p.key;
}