一.函数模板
函数模板定义:
template<typename | class T>
返回类型 函数名(形参表)
注:不允许templat语句和函数模板之间有任何其他语句
函数模板的类型参数可以不止一个
template<typename T1,typename T2,typename T3>
T1 Func( T1 a , T2 b, T3 c)
适用情况:函数参数个数相同而类型不同
模板参数的匹配问题
1.强制转换
cout<<Max ( double(2) ,2.3)<<endl;
2.通过<>指定类型
cout<<Max<double>(2,2.3)<<endl;
3.指定多个模板参数
template< typename T1, typename T2>
T1 Max (T1 x , T2 y)
模板形参表——非类型参数
tempalte<typename T1 , int size>
T1 Func ( T1 a[],int n)
注:函数调用 Func(a,10);
函数模板重载:函数名相同,参数的个数或者类型不同
目的:有些数据类型存在盲点,无法正确运算,例如字符串类型的数据比较大小必须得用strcmp函数,否则就会变成地址的比较
template<typename T>
T Max(T x,T y)
{return x>y?x:y;}
char *Max(char *s1,char *s2)
{return strcmp(x,y)>0?x:y}
例:求两个数,三个数和一组数的最大值
#include<iostream>
using namespace std;
template<typename T>
T Max(T x ,T y)
{return x>y?x:y;}
template<typename T>
T Max(T x,T y,T z)
{
T max=0;
if(x>y)
max=x;
else
max=y;
if(max<z)
max=z;
return max;
}
template<typename T>
T Max(T a[],int n)
{
T max=0;
for(int i=0;i<n;i++)
{
if(a[i]>max)
max=a[i];
}
return max;
}
int main()
{
int k;
k=Max(2,3);
double p;
p=Max(2.33,4.11,8.99);
int a[]={1,2,3,4,5,6,7,8,9,3,78,56,889,999};
int l=Max(a,14);
cout<<k<<endl;
cout<<p<<endl;
cout<<l<<endl;
return 0;
}
二.类模板
目的:使其中的某些数据成员,成员函数的参数或返回值与具体类型无关。
基本结构:
template<typename T>
class ...
{
T 函数名(T 参数名....)
}
类体外定义:
template<typename T>
返回值类型 类名 <T>::函数名(参数列表)
定义为内联函数:
inline T 类名<T> 函数名(参数)
类模板实例化:类模板->模板类->对象
类名 <数据类型>对象名
Stack <int> a;
类模板参数:
1.非类型参数
template<typename T, int size>
class....
2.默认模板参数
template<typename T, int size=10>【注:必须放在右端】
class....