C++模板
函数模板
为什么要使用模板
我们看一个例子:函数重载
int max(int a,int b){
return a>b?a:b;
}
int max(int a,float b){
return a>b?a:b;
}
int max(float a,float b){
return a>b?a:b;
}
尽管函数重载很方便:可以将同功能的函数设置为同名。
但是,如果我们需要修改函数内部逻辑,就需要将每个函数都修改一遍,不方便维护,且函数重载并没有代码重用。
函数模板定义
template<typename T> //假设类型名为T
T getMax(T a, T b) //返回值,a和b的类型都为T
{
return a>b?a:b;
}
使用函数模板
int main(int argc, const char * argv[]) {
cout<< getMax<int>(1, 2) <<endl; //输出2
cout<< getMax<double>(1.2, 2.3) <<endl; //输出2.3
cout<< getMax<float>(1.2, 2.3) <<endl; //输出2.3
cout<< getMax(1.2, 2.3) <<endl; //省略类型(自动判断数据类型)
}
多类型的函数模板
template<typename T1,typename T2,typename T3> //假设类型名为T
T3 getMax(T1 a, T2 b) //返回值,a和b的类型都为T
{
return a>b?a:b;
}
int main(int argc, const char * argv[]) {
cout<< getMax<int,int,int>(1, 2) <<endl; //输出2
cout<< getMax<double,double,double>(1.2, 2.3) <<endl; //输出2.3
cout<< getMax<float,float,float>(1.2, 2.3) <<endl; //输出2.3
cout<< getMax<int,float,float>(2, 2.3) <<endl;
}
类模板
类模板定义
template <class T> //假设类型T
class A
{
public:
void hello(T a){ //将变量a设置为T类型
cout<<"hello "<<a<<endl;
}
};
使用类模板
int main(int argc, const char * argv[]) {
A<string> a; //将类型T实例化为string类型
a.hello(“world”); //输出hello world
}
类模板中使用函数模板
template <class T> //假设类型T
class A{
public:
template <class T2> //成员函数模板
void Func(T2 t) {
cout << t<<endl;
}
};
int main(int argc, const char * argv[]) {
A<int> a; //初始化对象时只需要指定**类模板中的类型**
a.Func<int>('A'); //输出65
a.Func("hello"); //输出hello(自动判断数据类型)
return 0;
}