无锡专业网站推广,物流网站怎么做的,php多语言网站怎么做,dw做网站需要数据库么文章目录函数模板的定义函数模板的实例化模板参数模板参数的匹配问题解决参数的匹配问题的方法模板函数的形参表函数模板的特化函数模板提供了一种通用的函数行为#xff0c;该函数行为可以用多种不同的数据类型进行调用#xff0c;编译器会根据调用类型自动将它实例化为具体…文章目录函数模板的定义函数模板的实例化模板参数模板参数的匹配问题解决参数的匹配问题的方法模板函数的形参表函数模板的特化函数模板提供了一种通用的函数行为该函数行为可以用多种不同的数据类型进行调用编译器会根据调用类型自动将它实例化为具体数据类型的函数代码也就是说函数模板代表了一个函数家族。与普通函数相比函数模板中某些函数元素的数据类型是未确定的这些元素的类型将在使用时被参数化与重载函数相比函数模板不需要程序员重复编写函数代码它可以自动生成许多功能相同但参数和返回值类型不同的函数函数模板的定义templatetypenameT1,typenameT2,....返回类型 函数名(参数表){......}template是模板定义的关键字 写在中的T1 T2,…是模板参数其中的typename表示其后的参数可以是任意类型的#includeiostreamusingnamespacestd;#if0intMin(inta,intb){returnab?a:b;}floatMin(floata,floatb){returnab?a:b;}doubleMin(doublea,doubleb){returnab?a:b;}charMin(chara,charb){returnab?a:b;}#endiftemplatetypenameTTMin(T a,T b){returnab?a:b;}intmain(void){intm9,n3;doubled11.8,d23.4;coutMin(m,n)endl;coutMin(d1,d2)endl;return0;}函数模板的实例化当编译器遇到关键字template和跟随其后的参数定义时它只是简单地知道这个函数模板在后面的程序代码中可能会用到。除此之外编译器并不会做额外的工作。在这个阶段函数模板本身并不能使编译器产生任何代码因为编译器此时并不知道函数模板要处理的具体数据类型根本无法生成任何函数代码当编译器遇到程序中对函数模板的调用时它才会根据调用语句中实参的具体类型确定模板参数的数据类型并用此类型替换函数模板的模板参数生成能够处理该类型的函数代码即模板函数可以执行以下命令观察nm a.out|grepa.out模板参数模板参数的匹配问题C在实例化函数模板的过程中只是简单地将模板参数替换为实参的类型并以此生成模板函数不会进行参数类型的任何转换。这种方式与普通函数的参数处理有着极大的区别以前在普通函数的调用过程中会进行参数的自动类型转换以上程序能够正确执行。现在使用函数模板来实现通用的功能如下所示#includeiostreamusingnamespacestd;templatetypenameTTMax(T a,T b){returnab?a:b;}intmain(void){doublea2,b3.4;floatc1.1,d2.2;cout2, 3.4 的最大值是: Max(a,b)endl;couta, c的最大值是: Max(a,c)endl;couta, 100的最大值是: Max(a,100)endl;return0;}编译以上程序产生模板参数不匹配的错误。产生这个错误的原因是模板实例化过程中不会进行任何的参数类型转换。编译器在翻译Max(a,c)时由于实参类型为double和float而Max函数模板只有一个形参类型T总不能让T同时取double和float两种类型吧要知道模板实例化过程中C不会进行任何形式的隐式类型转换于是产生了上述编译错误解决参数的匹配问题的方法在模板调用时进行参数类型的强制转换couta, c的最大值是: Max(a,double(c))endl;显示指定函数模板实例化的类型参数#includeiostreamusingnamespacestd;templatetypenameTTMax(T a,T b){returnab?a:b;}intmain(void){doublea2,b3.4;floatc1.1,d2.2;cout2, 3.4 的最大值是: Max(a,b)endl;couta, c的最大值是: Maxdouble(a,c)endl;couta, 100的最大值是: Maxdouble(a,100)end;return0;}指定多个模板参数在模板函数的调用过程中为了避免出现一个模板参数与多个调用实参的类型冲突问题可以为函数模板指定多个不同的类型参数#includeiostreamusingnamespacestd;templatetypenameT1,typenameT2T1Max(T1 a,T2 b){returnab?a:b;}intmain(void){doublea2,b3.4;floatc1.1,d2.2;cout2, 3.4 的最大值是: Max(a,b)endl;couta, c的最大值是: Max(a,c)endl;couta, 100的最大值是: Max(a,100)endl;return0;}模板函数的形参表不要误以为函数模板中的参数只能是类型形参它也可以包括普通类型的参数#includeiostreamusingnamespacestd;// 函数模板包含类型形参 T 普通类型参数 n数组长度templatetypenameTvoiddisplay(Tarr,unsignedintn){for(inti0;in;i){coutarr[i]\t;}coutendl;}intmain(void){inta[]{12,34,56,78,11,10,999};charb[]{x,y,z,n};display(a,sizeof(a)/sizeof(a[0]));display(b,sizeof(b)/sizeof(b[0]));return0;}函数模板的特化在某些情况下函数模板并不能生成处理特定数据类型的模板函数。上面例子中的Max函数模板可以计算int 或者 char类型数据的最大值但对于字符串类型却是无能为力的解决这类问题的方法就是对函数模板进行特化。所谓特化就是针对模板不能处理的特殊数据类型编写与模板同名的特殊函数专门处理这些数据类型。语法格式如下所示template返回类型 函数名特化的数据类型(参数表){....}#includeiostream#includecstringusingnamespacestd;templatetypenameTTMin(T a,T b){returnab?a:b;}templateconstchar*Min(constchar*a,constchar*b){coutMin(const char *, const char *)endl;return(strcmp(a,b)0)?b:a;}intmain(void){intm9,n3;doubled11.8,d23.4;coutMin(m,n)endl;coutMin(d1,d2)endl;coutMin(a,b)endl;coutMin(aaa,bbb)endl;return0;}