函数模板
模板: 把数据类型当作一个参数
且template<typename T> 和 template<class T> 是等效的
不使用模板
int Max(int a,int b){
return a>b?a:b;
}
string Max(string a,string b){
return a>b?a:b;
}
使用模板
- 一个未知类型
template <typename _Ty>
_Ty Max(_Ty a,_Ty b){
return a>b?a:b;
}
- 多个未知类型
template <class _Ty1,class _Ty2,class _Ty3>
void print(_Ty1 one,_Ty2 two,_Ty3 three){
cout<<one<<endl;
cout<<two<<endl;
cout<<three<<endl;
}
int main(){
//1.隐式,根据数据去推断类型
cout<<Max(1,2)<<endl; //_Ty:int
cout<<Max(string("abc"),string("abd"))<<endl;//_Ty:string
//2.显式调用
cout<<Max<double>(1.1,2.2)<<endl;
//3.多个未知类型
print(1,"string",1.1);
print<string,string,string>("string1","string2","string3");
return 0;
}
- 操纵自定义数据类型
class MM
{
public:
MM(string name,int age):name(name),age(age){}
string getName(){
return name;
}
int getAge(){
return age;
}
//关键之处,运算符重载
bool operator>(const MM& object){
return this->age > object.age;
}
protected:
string name;
int age;
};
void testUserData(){
cout<<Max(MM("name2",18),MM("name1",28)).getName()<<endl;//_Ty:MM
cout<<Max(MM("name2",18),MM("name1",28)).getAge()<<endl;
}
int main(){
cout<<"操作自定义类型"<<endl;
testUserData();
return 0;
}
//输出结果:
操作自定义类型
name1
28
类模板
//模板类
template <class _Ty>
class Data{
public:
Data(_Ty data) :data(data){}//初始化
void print();
protected:
_Ty data;
static int count;
};
//1.模板类不是一个真正的类,所以在用到类名的地方,都需要:类名<未知类型> 方式的使用
//2.模板类必须显式调用,不能隐式调用
//静态成员初始化
template <class _Ty>
int Data<_Ty>::count=0;
//模板类的函数在类外实现
template <class _Ty>//可以用别的字母替换_Ty
void Data<_Ty>::print(){
cout<<data<<endl;
}
//类模板的继承
template <class _Ty>
class MM:public Data<_Ty>{
public:
void print();
protected:
};
template <class _Ty>
void MM<_Ty>::print(){
cout<<"MM"<<endl;
}
int main(){
Data<string> temp("baby");
temp.print();
Data<string>* pBaby=new Data<string>("newBaby");
pBaby->print();
MM<int> mm;
mm.print();
return 0;
}
//输出结果:
baby
newBaby
MM
模板中带有变量
封装定长数组
template <class _Ty,size_t size>
class MyArray{
public:
MyArray(){
pMem=new _Ty[size];
}
protected:
_Ty* pMem;
};
int main(){
MyArray<int,3> iArray;
return 0;
}
通过重载运算符实现方括号访问数据
template <class _Ty,size_t size>
class MyArray{
public:
MyArray(){
pMem=new _Ty[size];
}
_Ty& operator[](int index)
{
return pMem[index];
}
protected:
_Ty* pMem;
};
int main(){
MyArray<int,3> iArray;
for(int i=0;i<3;i++){
iArray[i]=i;
cout<<iArray[i]<<"\t";
}
cout<<endl;
return 0;
}