【C++函数模板全面解析】

发布时间:2026/6/10 3:48:27

【C++函数模板全面解析】 函数模板templatetypename T 函数声明或者定义作用将类型参数化#includeiostreamusing namespace std;//交换两个整形voidswapint(inta,intb){int tempa;ab;btemp;}//交换两个浮点型voidswapdouble(doublea,doubleb){double tempa;ab;btemp;}//函数模板templatetypenameT//声明一个模板告诉编译器后面代码中紧跟的T不要报错T是一个通用的数据类型voidmyswap(Ta,Tb){Ttempa;ab;btemp;}voidtest01(){int a10;int b20;//swapint(a, b);//利用函数模板交换//两种方式//1.自动类型推导//myswap(a, b);//2显示指定类型myswapint(a,b);coutaaendl;coutbbendl;double c1.1;double d2.2;swapdouble(c,d);//cout c c endl;//cout d d endl;}intmain(){test01();system(pause);}函数模板注意事项1.自动类型推导必须推导出一致的数据类型T才可以使用2.模板必须要确定出T的数据类型才可以使用#includeiostreamusing namespace std;//实现通用 对数组进行排序的函数//从大到小 选择排序 char 数组 int数组templateclassTvoidmyswap(Ta,Tb){Ttempa;ab;btemp;}templateclassTvoidmysort(Tarr[],int len){for(int i0;ilen;i){int maxi;for(int ji1;jlen;j){if(arr[max]arr[j]){maxj;}}if(max!i){myswap(arr[max],arr[i]);}}}templateclassTvoidprintarray(Tarr[],int len){for(int i0;ilen;i){coutarr[i] ;}coutendl;}voidtest01(){char chararr[]ascbdf;int numsizeof(chararr)/sizeof(char);mysort(chararr,num);printarray(chararr,num);}voidtest02(){int intarr[]{7,4,5,8,2,1};int numsizeof(intarr)/sizeof(int);mysort(intarr,num);printarray(intarr,num);}intmain(){test02();system(pause);}普通函数和函数模板的区别1.普通函数调用可以发生隐式类型转换2.函数模板 用自动类型推导不可以发生隐式类型转换3.函数模板 用显式指定类型可以发生隐式类型转换#includeiostreamusing namespace std;//普通函数intmyadd(int a,int b){returnab;}//函数模板templateclassTTmyadd1(Ta,Tb){returnab;}voidtest01(){int a10;int b20;char cc;coutmyadd(a,c)endl;//输出109此时c发生隐式类型转换coutmyadd1(a,b)endl;//自动推导不会发生隐式类型转换coutmyadd1int(a,c);//显式指定类型会发生隐式类型转换}intmain(){test01();system(pause);}建议使用显式指定类型普通函数和函数模板的调用规则1.如果函数模板和普通函数都可以调用优先调用普通函数2.可以通过空模板函数列表的方式强制调用函数模板3.函数模板也可以发生函数重载4.如果函数模板可以发生更好的匹配优先调用函数模板#includeiostreamusing namespace std;voidmyprint(int a,int b){cout普通函数的调用endl;}templateclassTvoidmyprint(Ta,Tb){cout模板的调用endl;}templateclassTvoidmyprint(Ta,Tb,Tc){cout模板的调用endl;}voidtest01(){int a10;int b20;myprint(a,b);//通过空模板的参数列表强制调用函数模板myprint(a,b);myprint(a,b,100);char ma;char nb;myprint(m,n);}intmain(){test01();system(pause);}模板的局限性模板不是万能的有些特定的数据类型需要用具体化方式做特殊实现#includeiostreamusing namespace std;#includestringclassperson{public:person(string name,int age){m_namename;m_ageage;}string m_name;int m_age;};templateclassTboolmycompare(Ta,Tb){if(ab){returntrue;}else{returnfalse;}}//利用具体化person版本templateboolmycompare(person p1,person p2){if(p1.m_namep2.m_namep1.m_agep2.m_age){returntrue;}else{returnfalse;}}voidtest01(){int a10;int b20;//bool ret mycompare(a, b);//if (ret) {// cout ab endl;//}//else {// cout a!b endl;//}personp1(TOM,10);personp2(TOM,10);bool retmycompare(p1,p2);if(ret){coutp1p2endl;}else{coutp1!p2endl;}}intmain(){test01();system(pause);}总结1.利用具体化模板可以解决自定义类型的通用化2.学习模板不是为了写模板而是在STL能够运用系统提供的模板文章总结C函数模板全面解析一、核心概念函数模板是C泛型编程的基础通过templatetypename T或templateclass T声明将数据类型参数化实现代码复用。二、主要内容要点1. 函数模板基础语法templatetypename T void func(T param)作用将类型参数化避免为不同类型编写重复代码使用方式自动类型推导func(a, b)显式指定类型funcint(a, b)2. 注意事项自动类型推导必须推导出一致的数据类型T模板必须确定出T的数据类型才能使用3. 普通函数与函数模板的区别特性普通函数函数模板隐式类型转换支持自动推导不支持显式指定支持代码复用性低高编译时处理编译时确定编译时实例化4. 调用规则优先级优先调用普通函数如果两者都可调用强制调用模板通过空模板参数列表func()模板重载函数模板支持重载模板优先如果模板能更好匹配参数类型5. 模板的局限性不是万能的某些特定数据类型需要特殊处理解决方案使用具体化模板template specialization应用场景自定义类型如类对象的比较操作核心思想学习模板是为了运用STL等系统提供的模板三、关键代码示例基本模板templatetypename T void swap(T a, T b)数组排序模板支持不同类型数组的通用排序类型转换对比展示普通函数与模板在隐式转换上的差异具体化模板为自定义Person类实现特殊比较逻辑四、学习建议掌握基础语法理解template关键字和类型参数区分使用场景知道何时用普通函数何时用模板理解编译机制模板是在编译时实例化的实践应用重点学习如何在STL中运用系统模板注意局限性了解模板的边界学会使用具体化解决特殊需求五、总结函数模板是C泛型编程的核心工具通过类型参数化实现代码的高度复用。虽然功能强大但也有其局限性需要结合具体化模板等技术来解决特殊问题。最终目标是能够熟练运用STL等库中提供的成熟模板提高开发效率。核心价值一次编写多处使用类型安全编译时检查提高代码复用性和可维护性。

相关新闻