一.函数模板
函数模板定义:
template<typename | class T>
注:不允许templat语句和函数模板之间有任何其他语句
函数模板的类型参数可以不止一个
template<typename T1,typename T2,typename T3>
适用情况:函数参数个数相同而类型不同
模板参数的匹配问题
1.强制转换
cout<<Max ( double(2) ,2.3)<<endl;
2.通过<>指定类型
cout<<Max<double>(2,2.3)<<endl;
3.指定多个模板参数
template< typename T1, typename T2>
模板形参表――非类型参数
注:函数调用 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,>【注:必须放在右端】
class....