当前位置: 首页 > news >正文

【C++】模板基础概念

模板初阶

  • 之前我们使用函数重载完成交换函数,但是是有缺点的:函数重载仅仅是类型不同,每次有新类型出现时,就需要用户自己增加对应代码,代码复用率低;代码的可维护性低,一个出错可能代表着所有重载均出错
  • 因此C++中允许存在一个模具,通过填充不同类型,来生成对应类型的代码
  • 泛型编程:编写与类型无关的通用代码,是代码复用的一种手段
  • 模板是泛型编程的基础,模板分为函数模板和类模板

函数模板

概念

  • 函数模板代表一个函数家族,该函数模板与类型无关,在使用时根据实参类型产生特定类型版本
  • 在编译器编译阶段,对于模板函数的使用,编译器会根据传入的实参类型来推演生成对应类型的函数

格式

template<typename T1,typename T2…typename T3>
函数返回值 函数名(参数列表)
{
}
(注意:typename是用来定义模板参数的关键字,也可以使用class)

template<typenameT>voidSwap(T&a,T&b){T tmp=a;a=b;b=tmp;}

实例化

隐式实例化:让编译器根据实参推演模板参数并生成对应类型函数
template<typenameT>TAdd(constT&a,constT&b){returna+b;}intmain(){inta=10;intb=20;Add(a,b);doublec=10.1;doubled=20.2;Add(c,d);//Add(a,c);不行//1.强制类型转换Add(a,(int)c);//2.显式实例化return0;}
显式实例化:在函数名后加<>,在<>中指定模板参数的类型
//2.显式实例化Add<int>(a,c);
  • 如果类型不匹配,编译器会进行隐式类型转换,如果无法转换,就会编译报错

参数匹配原则

  • 一个非模板函数可以和一个同名的模板函数同时存在
  • 对于非模板函数可以和一个同名的模板函数,如果其他条件都相同,调用函数时会优先调用非模板函数,不会用模板来生成

类模板

格式

template<class T1,classT2…class Tn>
class 类名
{
//类内成员
};

实例化

#include<iostream>usingnamespacestd;template<classT>classStack{public:Stack(intn=4):_a(newT[n]),_size(0),_capacity(n){}~Stack(){delete[]_a;_size=0;_capacity=0;}voidPush(constT&x);private:T*_a;size_t _size;size_t _capacity;};template<classT>voidStack<T>::Push(constT&x){if(_capacity==_size){T*tmp=newT[_capacity*2];memcpy(tmp,_a,_capacity);delete[]_a;_a=tmp;_capacity*=2;}_a[_size++]=x;}intmain(){//类模板都是显式实例化Stack<int>st1;Stack<double>st2;st1.Push(1);st1.Push(2);st1.Push(3);st1.Push(4);return0;}
http://www.cnnetsun.cn/news/2516420.html

相关文章:

  • 解密MacBook Touch Bar在Windows系统的完整显示驱动实现
  • 嵌入式工程师进阶指南:从C语言到系统架构的30万年薪技能图谱
  • 汽车级MCU MSPM0G3505-Q1实战:从Cortex-M0+内核到CAN-FD与低功耗设计全解析
  • AWR1642毫米波雷达I2C驱动集成:实现PMIC动态电源管理与优化
  • 基于OpenHarmony与SC-3568HA的工业网关开发实战:从硬件选型到分布式应用
  • iOS 17.6.1系统更新深度解析:错误修复、安全加固与升级指南
  • 瑞萨RA8 MCU开发实战:从零搭建e2 studio工程与FSP配置详解
  • 新能源动力域系统级测试:从HIL仿真到自动化验证的完整解决方案
  • LangGraph实战:构建可控、可调试的复杂AI工作流
  • 免费卸载软件再推荐!支持多款软件同时卸载、注册表清理、垃圾文件清理、空文件查找、进程管理、启动管理等等功能!强制卸载+系统清理,绝了
  • 一次性掌握Mapbox地图开发框架
  • web服务器的实验(RHCE)
  • JSON差异对比终极指南:3分钟掌握开源神器操作技巧
  • 条码唯一性比对系统的技术实现与工业落地
  • 国产 AI 漫剧制作工具有哪些?5 款高性价比工具实测,新手也能快速出片
  • 搭建CMake+Ninja+GCC开发GD32
  • Yolov8-pose关键点检测:CVPR2026 UCMNet |FrequencyCM赋能YOLO C2f:从频域增强视角解决感受野与细节瓶颈
  • 视频号视频下载去水印方法全是坑?全网视频一键拿捏!2026封神玩法!
  • 重磅首发|医学文献王Mac版+Office引用加载项同步上线,今晚直播解锁科研高效密码
  • Sora 2动态纹理流送与Unreal Niagara系统深度联调,GPU显存占用降低63%——一线影视工作室内部技术备忘录
  • DeepSeek V2 vs. DeepSeek-R1:参数冻结策略、LoRA适配层、量化精度损失的3维硬核对比
  • 【2024最新】ChatGPT SEO文章写作SOP:含关键词布局模板、EEAT强化话术、结构化Schema注入三步法
  • 【机密级部署白皮书首发】:DeepSeek-V2.5私有化集群在信创环境(鲲鹏920+统信UOS+达梦V8)的12小时极速上线实录
  • 产品经理核心能力,根本不是画原型
  • 终极指南:如何实现《塞尔达传说:旷野之息》Switch与WiiU存档无缝互通
  • Ender-3固件配置:从困惑到精通的完整指南
  • 大数据之安装HBase2.2.6
  • 终极指南:快速完整破解Cursor Pro限制的免费工具
  • Mac Mouse Fix完整指南:让你的普通鼠标变身专业级Mac输入设备
  • AI智能切片不是‘一键分割’就完事:批量口播视频的工程化切片陷阱与工具选型