在C++发明阶段,C++之父Stroustrup和贝尔实验室的C++小组对原先的宏方法进行了修订,对其进行了简化并将它从预处理范围移入了编译器。这种新的代码替换装置被称为模板。模板定义:模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模版可以分为两类,一个是函数模版,另外一个是类模版。
面对代码重用,我们有哪些选择呢?比如:宏定义,函数重载...,我们以比较两个数的大小为例:
#define MAX(a,b) (a>b)?a:b
int max(int a, int b){
return (a>b)?a:b;
}
float max(float a, float b){
return (a>b)?a:b;
}
char max(char a, char b){
return (a>b)?a:b;
}
int main(){
int int_a=2,int_b=3;
float float_a=2.0,float_b=3.0;
char char_a='a',char_b='b';
printf("=============macro definition======\n");
printf("max(2,3)=%d\n",MAX(int_a,int_b));
printf("max(2.0,3.0)=%f\n",MAX(float_a,float_b));
printf("max(a,b)=%c\n",MAX(char_a,char_b));
printf("=============overload==============\n");
printf("max(2,3)=%d\n",max(int_a,int_b));
printf("max(2.0,3.0)=%f\n",max(float_a,float_b));
printf("max(a,b)=%c\n",max(char_a,char_b));
return 0;
}
[work@sunxin template]$ make
g++ -g -c main.cpp
g++ -g -o main main.o -lpthread
[work@sunxin template]$ ./main
=============macro definition======
max(2,3)=3
max(2.0,3.0)=3.000000
max(a,b)=b
=============overload==============
max(2,3)=3
max(2.0,3.0)=3.000000
max(a,b)=b
但是对于宏定义而言,他只是在预处理时的代码复制过程。而对于函数重载,对不同类型的参数都必须单独写一个重载函数,而它内部的处理逻辑可能是完全一样的,代码显得比较臃肿。
当当当...于是乎,模版横空出世了。
template <typename T>
T max(T a, T b){
return (a>b)?a:b;
}
int main(){
int int_a=2,int_b=3;
float float_a=2.0,float_b=3.0;
char char_a='a',char_b='b';
printf("max(2,3)=%d\n",max(int_a,int_b));
printf("max(2.0,3.0)=%f\n",max(float_a,float_b));
printf("max(a,b)=%c\n",max(char_a,char_b));
return 0;
}
[work@sunxin template]$ make
g++ -g -c main.cpp
g++ -g -o main main.o -lpthread
[work@sunxin template]$ ./main
max(2,3)=3
max(2.0,3.0)=3.000000
max(a,b)=b
参考引文:
[1] 深度解析C++模版,http://developer.51cto.com/art/201208/351569.htm
[2] C++模版学习,http://www.cnblogs.com/gaojun/archive/2010/09/10/1823354.html