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

[C++入门]简化的艺术---对模版的初步探索

        

目录

一,函数模版

运行结果​编辑

运行结果

二,类模板

1、基本语法

2、int数组展开

3、string数组展开


        在古代,印刷术没有发明出来之前,知识的传播极其不方便,在C语言中也是,对于一个函数,不同的参数类型,需要反复地CV修改,那么在C++中,就出现了极其方便的工具,来简化操作,提高效率。

一,函数模版

首先我们就拿swap函数来举例,当然在后续引入数据库之后,就可以直接使用了,这里我们拿来举例子

void Swap(int& left, int& right)
{int temp = left;left = right;right = temp;
}
void Swap(double& left, double& right)
{double temp = left;left = right;right = temp;
}
void Swap(string& left, string& right)
{string temp = left;left = right;right = temp;
}
int main()
{int  a = 1, b = 2;double x = 1.1,y = 2.2;string m = "abc", n = "qwe";swap(a, b);swap(x, y);swap(m, n);cout << a << " " << b << endl << x << " " << y<<endl<<m<<"  "<<n;}

运行结果

写起来很不方便,换个类型就得再写一遍参数列表,那么怎么解决这个问题呢

答案就是用函数模版,让编译器去替咱们干活

template <class T>
void mySwap(T& a, T& b) {T temp = a;a = b;b = temp;
}int main() {int x = 10, y = 20;mySwap(x, y);  cout << "x=" << x << ", y=" << y << endl;  double m = 1.5, n = 2.5;mySwap<double>(m, n);  cout << "m=" << m << ", n=" << n;  return 0;
}

运行结果

二,类模板

1、基本语法

template <typename T>  // 模板声明
class 类名 {
public:// 成员声明(使用T作为类型)
};

这里我们拿一个动态数组进行举例

在这个数组中,我在类内定义了打印,在类外重载了下标访问,实例化了两个数组进行演示

template <typename T, int size>  
class Array {
private:T arr[size];
public:T& operator[](int index) { }void print() {for (int i = 0; i < size; ++i) {cout << arr[i] << " ";}cout << endl;}
};
template <typename T, int size>
T& Array<T, size>::operator[](int index) {if (index < 0 || index >= size) {throw out_of_range("Index out of range");}return arr[index];
}
int main() {Array<int, 5> intArr; for (int i = 0; i < 5; ++i) {intArr[i] = i * 10;}intArr.print();Array<string, 3> strArr; strArr[1] = "Template";strArr[2] = "Magic";strArr.print();return 0;
}

2、运行结果

在这里对main中的两个实例化对象进行展开

2、int数组展开

class Array_int_5 {
private:int arr[5];  // 固定5个int的内存
public:int& operator[](int index) { if (index < 0 || index >= size) {throw out_of_range("Index out of range");}return arr[index]; }void print() {    for (int i = 0; i < size; ++i) {cout << arr[i] << " ";}cout << endl;
} }
};

这就是编译器对int数组的展开,其中intArr[i]=i*10展开是

intArr.operator[](i) = i * 10

其中 throw out_of_range 是C++中特有的处理问题的一种方式,抛异常,在数组下标范围错误时,就会弹出一下警告

3、string数组展开

class Array<string, 3> {string arr[3];
public:string& operator[](int index) {if (index < 0 || index >= 3)throw out_of_range("Index out of range");return arr[index];}void print() {    for (int i = 0; i < size; ++i) {cout << arr[i] << " ";
}
};

具体内容和上边类似,string的相关讲解将会在下一篇文章更新

以上就是本篇博客的全部内容啦,欢迎大家在评论区讨论交流!!!

http://www.xdnf.cn/news/11916.html

相关文章:

  • 敏捷项目管理:重塑价值交付的动态协作范式
  • 什么是内网映射?如何将内网ip映射到外网访问?
  • OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
  • 一起学Spring AI:核心概念
  • 极速唤醒:高通平台 Android15 默认跳过锁屏,秒启主界面!
  • 每天总结一个html标签——Audio音频标签
  • ideal2022.3.1版本编译项目报java: OutOfMemoryError: insufficient memory
  • iOS上传应用包错误问题 “Invalid bundle. The “UIInterfaceOrientationPortrait”“
  • 打卡第36天:模型可视化以及推理
  • 机器学习监督学习sklearn实战三:八种算法对印第安人糖尿病预测数据进行分类和比较
  • 什么是终端安全管理系统(终端安全管理软件2024科普)
  • 12306高并发计算架构揭秘:Apache Geode 客户端接入与实践
  • OpenCV C++ 心形雨动画
  • Web3时代的数据保护挑战与应对策略
  • Elasticsearch的插件(Plugin)系统介绍
  • Java中Git基础操作详解(clone、commit、push、branch)
  • 数据结构(7)—— 二叉树(1)
  • 【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)
  • Fullstack 面试复习笔记:Java 基础语法 / 核心特性体系化总结
  • 【Vue】初学Vue(setup函数,数据响应式, 脚手架 )
  • vue 打包报错 Cannot find module ‘@vue/cli-plugin-babel/preset‘ - thread-loader
  • 力扣HOT100之二分查找:74. 搜索二维矩阵
  • 查找 Vue 项目中未使用的依赖
  • HashMap中的put方法执行流程(流程图)
  • 基于 PyTorch 的 VGG16 深度学习人脸识别检测系统的实现+ui界面
  • Kafka深度技术解析:架构、原理与最佳实践
  • Solana Web3 快速入门:创建并获取钱包账户的完整指南
  • vCenter与ESXi主机每分钟周期性断连修复
  • 《最近公共祖先》题集
  • 分布式电源接入配电网的自适应电流保护系统设计与实现