C++ 知识点22 函数模板
C 函数模板一、为什么要有函数模板先看痛点你要写两个交换函数int 版、double 版// int 交换 void swapInt(int a, int b) { int t a; a b; b t; } // double 交换 void swapDouble(double a, double b) { double t a; a b; b t; }逻辑完全一样只是类型不一样重复写代码太冗余。函数模板作用写一份通用逻辑不指定具体类型编译器根据你传的类型自动生成对应版本的函数。一句话一份模板适配所有类型。二、函数模板 标准语法1. 模板头写法两种写法都可以template typename T // 写法1推荐 template class T // 写法2老式写法效果一样template关键字声明这是模板里面是模板参数T是类型参数代表任意一种通用类型自己起名T/T1/T2 都行2. 完整函数模板格式template typename T 函数返回值 函数名(形参列表) { 函数逻辑里面用 T 当类型用 }三、写第一个函数模板通用交换函数#include iostream using namespace std; // 定义函数模板 template typename T void mySwap(T a, T b) { T temp a; a b; b temp; } int main() { int x 10, y 20; mySwap(x, y); // 自动推导 T int cout x y endl; double m 1.1, n 2.2; mySwap(m, n); // 自动推导 T double cout m n endl; return 0; }核心关键点你只写了一份代码编译器在编译时自动实例化出int版、double版函数不用自己重复写重载函数四、函数模板的两种调用方式1. 自动类型推导常用编译器根据实参自己猜出 T 是什么类型mySwap(x, y); // 自动推导出 Tint要求形参类型必须完全一致不能一个 int 一个 double。2. 显式指定类型手动告诉编译器 T 是什么类型mySwapint(x, y); mySwapdouble(m, n);适用场景无法自动推导时强制指定类型转换五、模板支持 多个类型参数可以定义多个通用类型 T1、T2template typename T1, typename T2 void printTwo(T1 a, T2 b) { cout a , b endl; } // 使用 printTwo(100, 3.14); printTwo(hello, 666);六、普通函数 和 函数模板 同时存在优先级规则如果普通函数能匹配上优先调用普通函数如果普通函数匹配不上编译器会实例化模板调用可以用空模板参数强制调用模板函数示例// 普通函数 void mySwap(int a, int b) { cout 调用普通函数 endl; } // 函数模板 template typename T void mySwap(T a, T b) { cout 调用函数模板 endl; } int main() { int a1,b2; mySwap(a,b); // 优先普通函数 mySwap(a,b); // 强制调用模板 double c1.1,d2.2; mySwap(c,d); // 只能匹配模板调用模板 return 0; }考试面试必背规则普通函数优先匹配模板做备胎强制走模板。七、函数模板 具体化 / 特化重点场景大部分类型用通用模板唯独某一个类型要单独特殊处理就用模板特化。语法格式// 通用模板 template typename T void show(T a) { cout 通用版本 a endl; } // 针对 string 类型 特化版本 template void showstring(string a) { cout string 特化版本 a endl; }调用规则匹配到特化版本 → 优先用特化否则用通用模板。八、函数模板 底层原理必须理解模板本身不生成函数只是一张 “图纸”编译阶段根据实参类型按照图纸生成对应类型的函数这个过程叫模板实例化用多少种类型就生成多少个重载版本只在第一次使用该类型时实例化后续复用九、函数模板 使用限制易错点 必记自动推导时实参类型必须严格一致templatetypename T void func(T a, T b); func(10, 3.14); // 报错一个int 一个double推导冲突解决显式指定funcint(10,3.14)模板里不能出现无法通用的操作比如模板里写T如果 T 是字符串、自定义类且没重载 直接报错。模板声明和实现不能拆分到 .h 和 .cpp因为编译时要看到完整模板代码否则无法实例化工程里模板一般全部写在头文件里。不能用局部类型、匿名类型做模板参数十、一句话浓缩 必背考点函数模板用templateclass T或templatetypename T定义作用一份代码适配多种数据类型减少冗余调用方式自动类型推导、显式指定类型普通函数和模板共存普通函数优先 强制走模板特化模板给特定类型单独定制逻辑原理模板是图纸使用时才实例化生成具体函数模板代码建议全写在头文件不要分离声明实现。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2604524.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!