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

【C++】”如虎添翼“:模板初阶

泛型编程

C++中一种使用模板来实现代码重用和类型安全的编程范式。它允许程序员编写与数据类型无关的代码,从而可以用相同的代码逻辑处理不同的数据类型。模板是泛型编程的基础

模板分为两类:

  1. 函数模板:代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本

  2. 类模板

函数模板:

代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生 函数的特定类型版本

提供一个函数的模板,但是类型是不固定的,对于这种编程也叫泛型编程

Template<typename T1, typename T2,......,typename Tn>//模板格式template<typename T>//T是一个类型的名称,没有要求;typename是一个关键字,后面跟的是泛型类型的名字,typename也能换成class。typename T合起来就是一个模板参数
void Swap(T& left,T& right)
{T temp = left;left = right;right = temp;
}
template<typename T>
void Swap(T& left,T& right)
{T temp = left;left = right;right = temp;
}
int main()
{int x = 1, y = 2;double m = 1.1, n = 2.2;Swap(x,y);//这里两处函数调用,看似调用的是一个函数,但实际上时调用了两个函数(函数调用要建立栈帧,一个是int类型,一个double类型,类型大小都不一样,更不可能调用的是同一个函数了),这个可以从汇编层来观察Swap(m,n);return 0;
}

观察汇编代码发现,call的地址不一样,说明调用的不是同一个函数。

原理:

编译器通过你编写的模板,再根据你传入的参数,自行生成对应的函数,调用的就是这个编译器自行生成的函数

如果你传入两个参数,这两个参数的类型不一样,就需要写两个模板参数,否则编译会不通过

正确做法如下:

template<typename T1, typename T2>
void Swap(T1&left,T2&right)
{T1 temp = left;left = right;right = temp;
}
int main()
{int x = 1, y = 2;double m = 1.1, n = 2.2;Swap(x,n);Swap(m,y);return 0;
}

相关文章:

  • 区块链大纲笔记
  • java每日精进 5.11【WebSocket】
  • Python爬虫第20节-使用 Selenium 爬取小米商城空调商品
  • 运用数组和矩阵对数据进行存取和运算——NumPy模块 之四
  • 现代化水库运行管理矩阵平台如何建设?
  • 【Linux篇章】Linux 进程信号2:解锁系统高效运作的 “隐藏指令”,开启性能飞跃新征程(精讲捕捉信号及OS运行机制)
  • 【文心智能体】使用文心一言来给智能体设计一段稳定调用工作流的提示词
  • 《数据结构初阶》【堆 + 堆排序 + TOP-K】
  • C++色彩博弈的史诗:红黑树
  • AI时代还需要目视解译吗?——目视解译详解
  • 横向移动(上)
  • [特殊字符] 本地大模型编程实战(29):用大语言模型LLM查询图数据库NEO4J(2)
  • OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
  • 键盘输出希腊字符方法
  • Neo4j 入门级使用
  • CSS3 伪类和使用场景
  • 【番外】02:Windows 编译带 DNN_CUDA 功能的 OpenCV 动态链接库
  • 系统架构设计(五):构件
  • 69、微服务保姆教程(十二)容器化与云原生
  • 【C#】ToArray的使用
  • 牟海松任国家信访局副局长
  • 冷冰川谈黑白
  • 巴西总统卢拉将访华
  • 华泰柏瑞基金总经理韩勇因工作调整卸任,董事长贾波代为履职
  • 太原一高中生指出博物馆多件藏品标识不当,馆方已邀请他和专家共同探讨
  • 央行:5月8日起7天期逆回购操作利率由此前的1.50%调整为1.40%