模板:将类型定义为参数,实现类型参数化,实现代码重用。
一、函数模板
格式:
(template-声明模板的关键字,class修饰形参类型)
template <class / typename T>
返回类型 函数名(形参){函数体}
实现函数接收任意类型参数
#include<iostream>
using namespace std;
template <class T>//定义模板:T类型表示任意类型
T min1(T x,T y)//该函数可接收任意参数类型
{return (x<y)?x:y;
}
int main()
{int a=2,b=10;double c=1.5,d=5.6;cout<<"较小整数:"<<min1(a,b)<<endl;cout<<"较小实数:"<<min1(c,d)<<endl;}
运行结果
注:定义函数名时注意不要与标准命名空间(std)中的函数名同名,否则会报错!!!
二、类模板
格式:
(template-声明模板的关键字,class修饰形参类型)
template <class / typename T>
class 类名{类的声明}
实现类接收任意类型参数
#include<iostream>
using namespace std;
template <class T1,class T2>//定义一个模板:定义两个任意类型
class myClass{//类中定义两个任意类型参数 private:T1 t1;T2 t2;public:myClass(T1 a,T2 b):t1(a),t2(b){}//构造函数 void show(){cout<<"t1="<<t1<<"\tt2="<<t2<<endl;}
};
int main()
{myClass<int,int> m1(3,5);//类模板实例化时要指明类模板类型 myClass<char,char> m2('s','w');myClass<double,char> m3(1.3,'e');m1.show();m2.show();m3.show();}
运行结果
注:类模板实例化时要指明类模板类型
若函数定义在类外部,则需要定义多个模板
#include<iostream>
using namespace std;
template <class T1,class T2>//定义一个模板:定义两个任意类型
class myClass{//类中定义两个任意类型参数 private:T1 t1;T2 t2;public:myClass(T1 a,T2 b);//构造函数 void show(){cout<<"t1="<<t1<<"\tt2="<<t2<<endl;}
};
template <class T1,class T2>//需要再定义一个模板,否则模板会丢失
myClass<T1,T2>::myClass(T1 a,T2 b):t1(a),t2(b){}//定义构造函数
int main()
{myClass<int,int> m1(3,5);//类模板实例化时要指明类模板类型 myClass<char,char> m2('s','w');myClass<double,char> m3(1.3,'e');m1.show();m2.show();m3.show();}