在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