[C++]从入门到精通-template

本文内容组织形式

  • 为什么需要template特性?
  • 使用方法
  • 原理
    • 重载&模版C++代码实现
    • Linux编译汇编码命令
    • 结论
  • 猜你喜欢
  • PS

为什么需要template特性?

总结: 本质上C++的template和Java的范性是一个东西,是高级语言中的语法糖,本质上编译生成的汇编代码,和同时使用重载特性生成的汇编码一样。

使用方法

#include <iostream>// 模版例子
template <typename T>
T add(T a, T b) {return a + b;
}int main() {// 使用整数std::cout << "整数相加: " << add(5, 3) << std::endl;// 使用浮点数std::cout << "浮点数相加: " << add(5.5, 3.7) << std::endl;// 使用字符std::cout << "字符相加: " << add('A', 1) << std::endl;return 0;
}

如上例子,相当于可以使用不同的数据类型来实现同一个方法,但这种方法其实C++中其他方法也能实现这种扩展的方法,例如如下重载的例子,但是现在只需要使用模版即可,并且从原理上看模版是从相当于塑造了一个编译器中的“抽象模版”,如果调用这个模版来进行代码生成,一个"代码蓝图",编译器根据使用生成具体函数, 更抽象一些说,本质上操作系统是贴在裸金属上的一层皮编译器是贴在操作系统上的一层皮,而C++等高级语言是长在编译器上的头发

int add(int a, int b) {return a + b;
}double add(double a, double b) {return a + b;
}char add(char a, int b) {return a + b;
}

原理

接下来说说 template依托那些计算机抽象来实现,这段逻辑是在编译器中进行实现,这里我们只关注编译器生成的汇编码是否有区别
PS: 以下内容可看可不看,不涉及到底层编译器开发的话,没必要知道,只是一堆逻辑
例如以下是分别使用模版和重载实现相同功能的业务代码,并使用linux命令进行汇编码生成

重载&模版C++代码实现

#include <iostream>
#include <string>
#include "template_example.hpp"class Calculator {
public:// 整数加法重载int add(int a, int b) {return a + b;}// 浮点数加法重载double add(double a, double b) {return a + b;}// 字符串连接重载std::string add(const std::string& a, const std::string& b) {return a + b;}
};int main() {// 测试函数重载Calculator calc;std::cout << "整数相加: " << calc.add(5, 3) << std::endl;std::cout << "浮点数相加: " << calc.add(3.14, 2.86) << std::endl;std::cout << "字符串连接: " << calc.add("Hello, ", "World!") << std::endl;// 测试函数模板std::cout << "整数最大值: " << max(10, 20) << std::endl;std::cout << "浮点数最大值: " << max(3.14, 2.86) << std::endl;// 测试类模板Container<int> intContainer(42);Container<std::string> strContainer("Hello Template!");std::cout << "整数容器值: " << intContainer.getValue() << std::endl;std::cout << "字符串容器值: " << strContainer.getValue() << std::endl;return 0;
} 
#include <iostream>
#include <string>// 使用模板方式实现计算器
template<typename T>
class TemplateCalculator {
public:// 加法T add(T a, T b) {return a + b;}// 减法T subtract(T a, T b) {return a - b;}// 乘法T multiply(T a, T b) {return a * b;}
};int main() {TemplateCalculator<int> intCalc;TemplateCalculator<double> doubleCalc;// 测试整数运算std::cout << "Template Int: " << std::endl;std::cout << "1 + 2 = " << intCalc.add(1, 2) << std::endl;std::cout << "5 - 3 = " << intCalc.subtract(5, 3) << std::endl;std::cout << "4 * 2 = " << intCalc.multiply(4, 2) << std::endl;// 测试浮点运算std::cout << "\nTemplate Double: " << std::endl;std::cout << "1.5 + 2.3 = " << doubleCalc.add(1.5, 2.3) << std::endl;std::cout << "5.5 - 3.2 = " << doubleCalc.subtract(5.5, 3.2) << std::endl;std::cout << "4.2 * 2.1 = " << doubleCalc.multiply(4.2, 2.1) << std::endl;return 0;
} 

Linux编译汇编码命令

g++ -S template_test.cpp -o template.s

结论

汇编太多就不放了,
总结就是两个代码生成的汇编代码语义完全相同,从使用体验来说template本质上就是一个语法糖。

猜你喜欢

C++多线程: https://blog.csdn.net/luog_aiyu/article/details/145548529
一文了解LevelDB数据库读取流程:https://blog.csdn.net/luog_aiyu/article/details/145946636
一文了解LevelDB数据库写入流程:https://blog.csdn.net/luog_aiyu/article/details/145917173

PS

你的赞是我很大的鼓励
欢迎大家加我飞书扩列, 希望能认识一些新朋友~
二维码见: https://www.cnblogs.com/DarkChink/p/18598402

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/29827.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始实现大语言模型(十三):预训练大语言模型GPTModel

1. 前言 使用梯度下降算法通过下一个token预测任务预训练大语言模型GPTModel&#xff0c;前向传播流程每次会输入一个batch的长度均为context_len的训练样本&#xff0c;执行 batch_size context_len \text{batch\_size}\times\text{context\_len} batch_sizecontext_len次下…

JavaScript(最后一个元素的索引就是数组的长度减 1)array.length - 1

在不同的编程语言中&#xff0c;表示数组中最后一个元素的方法略有不同&#xff0c;但基本思路都是利用数组的长度或索引来实现。 以下是一些常见编程语言中获取数组最后一个元素的方法&#xff1a; 1. JavaScript: 使用 array.length - 1 索引: 这是最常见和传统的方法。Java…

RV1126+FFMPEG多路码流监控项目

一.项目介绍&#xff1a; 本项目采用的是易百纳RV1126开发板和CMOS摄像头&#xff0c;使用的推流框架是FFMPEG开源项目。这个项目的工作流程如下(如上图)&#xff1a;通过采集摄像头的VI模块&#xff0c;再通过硬件编码VENC模块进行H264/H265的编码压缩&#xff0c;并把压缩后的…

Python组合数据类型(一)

目录 一、数据类型 1、基本数据类型 2、组合数据类型 二、介绍两个函数 1、 isinstance函数 2、len函数 三、Python指针 1、指针 2、is运算符和的区别 3、列表的指针 四、函数参数的传递 1、例子一 2、例子二 五、字符串详解 1、转义字符 2、字符串的切片 3、字…

Doris vs ClickHouse 企业级实时分析引擎怎么选?

Apache Doris 与 ClickHouse 同作为OLAP领域的佼佼者&#xff0c;在企业级实时分析引擎该如何选择呢。本文将详细介绍 Doris 的优势&#xff0c;并通过直观对比展示两者的关键差异&#xff0c;同时分享一个企业成功用 Doris 替换 ClickHouse 的实践案例&#xff0c;帮助您做出明…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

Android Native 之 文件系统挂载

一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知&#xff0c;init进程为android系统的第一个进程&#xff0c;也是native世界的开端&#xff0c;要想让整个android世界能够稳定的运行&#xff0c;文件系统的创建和初始化是必不可少的&#xff…

Chain of Draft: 借鉴人类草稿思维让大型语言模型更快地思考

这个研究探讨了大型语言模型&#xff08;LLMs&#xff09;在执行复杂推理任务时面临的计算资源消耗与响应延迟问题。研究特别聚焦于思维链&#xff08;Chain-of-Thought, CoT&#xff09;提示范式的效率局限性。CoT虽然有效&#xff0c;但在推理过程中需要生成冗长、详尽的逐步…

《A++ 敏捷开发》- 18 软件需求

需求并不是关于需求 (Requirements are not really about requirements) 大家去公共图书馆寄存物品&#xff0c;以前都是扫二维码开箱&#xff0c;有些图书馆升级了使用指纹识别。 “是否新方法比以前好&#xff1f;”我问年轻的开发人员。 “当然用指纹识别好。新技术&#x…

【智能体架构:Agent】LangChain智能体类型ReAct、Self-ASK的区别

1. 什么是智能体 将大语言模型作为一个推理引擎。给定一个任务&#xff0c; 智能体自动生成完成任务所需步骤&#xff0c; 执行相应动作&#xff08;例如选择并调用工具&#xff09;&#xff0c; 直到任务完成。 2. 先定义工具&#xff1a;Tools 可以是一个函数或三方 API也…

Vue进阶之Vue3源码解析(一)

Vue3源码解析 目录结构编译compiler-corepackage.jsonsrc/index.ts 入口文件src/compile.ts生成ASTsrc/parse.ts 代码转换src/transform.ts几种策略模式src/transforms/transformElement.tssrc/transforms/transformText.tssrc/transforms/transformExpression.ts 代码生成src/…

servlet tomcat

在spring-mvc demo程序运行到DispatcherServlet的mvc处理 一文中&#xff0c;我们实践了浏览器输入一个请求&#xff0c;然后到SpringMvc的DispatcherServlet处理的整个流程. 设计上这些都是tomcat servlet的处理 那么究竟这是怎么到DispatcherServlet处理的&#xff0c;本文将…

【我的待办(MyTodolists)-免费无内购的 IOS 应用】

我的待办&#xff08;MyTodolists&#xff09; 我的待办&#xff1a;智能任务管理助手应用说明主要功能为什么选择"我的待办"&#xff1f;隐私保障使用截图 我的待办&#xff1a;智能任务管理助手 应用说明 "我的待办"是一款智能化的任务管理应用&#x…

GCC RISCV 后端 -- C语言语法分析过程

在 GCC 编译一个 C 源代码时&#xff0c;先会通过宏处理&#xff0c;形成 一个叫转译单元&#xff08;translation_unit&#xff09;&#xff0c;接着进行语法分析&#xff0c;C 的语法分析入口是 static void c_parser_translation_unit(c_parser *parser); 接着就通过类似递…

Vim复制内容到系统剪切板

参考链接 【Vim】Vim 中将文件内容复制到系统剪切板的方法_vi 复制到系统剪贴板-CSDN博客 [转]vim如何复制到系统剪贴板 - biiigwang - 博客园 1. 确定Vim是否支持复制到系统剪切板 输入命令 vim --version | grep clipboard 如果是开头&#xff0c;说明支持系统剪切板&…

测试用大模型组词

已经把hanzi-writer的js的调用、hanzi-writer调用的数千个汉字的json文件&#xff0c;全都放在本地了。虽然用的办法还是比较笨的。我注意到 大模型也可以部署本地&#xff0c;虽然使用频率低的情况下不划算。 尝试直接通过html的javascript通过api key调用大语言模型&#x…

华为eNSP:配置单区域OSPF

一、什么是OSPF&#xff1f; OSPF&#xff08;Open Shortest Path First&#xff0c;开放最短路径优先&#xff09;是一种链路状态路由协议&#xff0c;属于内部网关协议&#xff08;IGP&#xff09;&#xff0c;主要用于在单一自治系统&#xff08;AS&#xff09;内部动态发现…

P62 线程

这篇文章我们来讲一下线程。截止到目前&#xff0c;我们的代码都是在单线程上运行的&#xff0c;现在看起来没有什么问题&#xff0c;但是目前所有的计算机几乎都不只有一个逻辑线程&#xff0c;所以如果我们一直使用单线程运行&#xff0c;这样的话效率会很低。尤其是如果我们…

Android AudioFlinger(五)—— 揭开AudioMixer面纱

前言&#xff1a; 在 Android 音频系统中&#xff0c;AudioMixer 是音频框架中一个关键的组件&#xff0c;用于处理多路音频流的混音操作。它主要存在于音频回放路径中&#xff0c;是 AudioFlinger 服务的一部分。 上一节我们讲threadloop的时候&#xff0c;提到了一个函数pr…

im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略

随着即时通讯技术的不断发展&#xff0c;IM即时聊天客服系统已经成为企业与客户沟通、解决问题、提升用户体验的重要工具。在选择IM即时聊天客服系统时&#xff0c;企业面临一个重要决策&#xff1a;选择SaaS&#xff08;软件即服务&#xff09;解决方案&#xff0c;还是进行私…