模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
函数模板如下面的例子:
int func_max(int a, int b)
{
return a>b?a:b;
}
求两个整数的最大值,func_max()的参数为int类型,如果我们需要求两个float型数的最大值,必须定义一个几乎一模一样的函数,这样就很容易造成代码的冗杂和重复。
为了解决类似的问题,C++衍生出了模板的概念。把类型参数化。
template <class T> T func_max(T a, T b)
{
return a>b?a:b;
}
int main()
{
int a1 = 1,a2 = 2;
printf("result:%d\n",func_max(a1,a2));
double b1 = 1.001,b2 = 0.003;
printf("result:%f\n",func_max(b1,b2));
}
结果:
result:2
result:1.001000
这里的T就是指参数的类型,他可以表示int、float、double等等,但是它只能表示一种类型。例如在上面的例子当中,如果我们比较a1和b2,编译时则会报错。
template <class T> T func_max(T a, T b)
{
return a>b?a:b;
}
int main()
{
int a1 = 1,a2 = 2;
printf("result:%d\n",func_max(a1,a2));
double b1 = 1.001,b2 = 0.003;
printf("result:%f\n",func_max(b1,b2));
printf("result:%f\n",func_max(a1,b2)); //编译报错
}
template <class T,typename M> T func_max(T a, M b)
{
return a>b?a:b;
}
int main()
{
int a1 = 1,a2 = 2;
printf("result:%d\n",func_max(a1,a2));
double b1 = 1.001,b2 = 0.003;
printf("result:%f\n",func_max(b1,b2));
printf("result:%d\n",func_max(a1,b2));
}
如果需要参数化多个类型,写法如上。注意返回值为第一个参数的类型。模板中,用class或者typename都可以。
类模板用法和函数模板相差不大:
template <typename T,class M>
class Test
{
private:
T a;
M b;
public:
Test(T a,M b)
{
this->a = a;
this->b = b;
}
void show()
{
cout<<"first: "<<a<<endl;
cout<<"second:"<<b<<endl;
}
};
int main()
{
Test<int,int> *test_1 = new Test<int,int>(3,5);
test_1->show();
Test<int,double> test_2(1,3.23);
test_2.show();
Test<int,double> test_3(2.12,3.12);//2.12会被强转为int
test_3.show();
}
结果:
first: 3
second:5
first: 1
second:3.23
first: 2
second:3.12
我们所使用的vector<int> test,其实就是使用了类模板的方式去实现的。