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

模板与泛型编程笔记(一)入门篇

1. 推荐书籍

《C++新经典 模板与泛型编程》难得的很容易看得懂的好书,作者讲技术不跳跃,娓娓道来,只要花点时间就能看懂。

2. 笔记

2.1 模板基础
  • 模板为什么要用尖括号?因为便于编译器解析,可以将模板和普通函数声明分开。其实尖括号就相当于函数声明中,用于把参数包裹起来的圆括号,其中参数,就是传入的类型模板参数。如
template <typename T> // 尖括号相当于函数的圆括号,T相当于函数的形参
class A {}

当然,模板支持传递的参数种类不止一种,有类型模板参数,非类型模板参数,模板模板参数。其实对于没有学习过模板的同学来说,这几种类型,即使说了也看不懂。就像某些教材一样,只负责陈述,不负责让你看懂。上面说的内容,在书中的前几章,有很多例子,一看就懂。

综上,可以认为模板就是一个编译期的代码生成函数,这个函数最原始的用途是在编译器解析后,生成实例化后的代码。后面发现,模板竟然支持编译期的分支判断和循环控制,支持对代码生成过程,增加更加精细和复杂的控制。逐步发展成了元编程,简单来说就是编译期编程。

2.2 模板特化
  • 一直搞不懂偏特化的模板怎么写,怎么推导。直到看到了《C++新经典 模板与泛型编程》的第5.1.3节,如以下
// 泛化版本 先写好泛化模板
template <typename T>
class A {}// 偏特化版本
template <typename T> // 最后写这里,声明一个泛化类型参数
class A<T *> // 因为泛化模板需要一个类型参数,特化版本需要调用泛化版本。所以这里需要传入一个类型,这里假设是T *,T是一个模板参数,需要在使用模板类A的时候指定。
{}

模板的特化版本,必须调用泛化版本。而且特化版本不能单独存在,必须先写出泛化版本的模板。综上可以理解为,特化版本是对泛化版本的一次编译期的“函数”封装,因为有一个调用的过程,所以这里我称之为函数封装。正因为是函数封装,在调用泛化模板时,需要保持参数数量相同。综上,模板写起来有很多限制,语法不是那么随意,这样的好处是便于编译器解析。

2.3 总体把握模板技术
  • 整个C++模板与泛型系统的底层逻辑是:调用模板,通过实参确定类型,根据特化情况,调用匹配的模板函数,推导和展开其他类型,直到无法继续展开。其中,类型匹配机制,实现了编译期的分支控制;递归调用模板,实现了循环控制,两种机制统称为编译器类型推导。二者结合,几乎所有的逻辑都可以实现。

  • 常见的模板类型有:函数模板,类模板,变量模板,别名模板。

  • 只有函数模板在使用的时候,可以不指定模板参数,编译器会自动推导,只需要指定函数实参即可。这就是为什么有时候模板不需要传一个用尖括号包起来的类型参数的原因。其他模板在使用的时候需要指定模板参数,也就是类型模板参数。

  • 模板的优点是编译期执行一些编译期间能够确定的逻辑,提高执行效率,省去一些动态类型转换与判断造成的性能损耗。如果一些信息不能在编译期确定,只能在运行期间确定,那这种情况下模板就发挥不了作用。模板还可以提高代码复用性,总体来说,模板是和代码架构相关的技术,一般需要花精力好好设计的可复用模块,才可能需要使用模板。任何技术都有它的应用场景,实事求是,因地制宜,才是少走弯路的方法。

  • 编写模板要大胆的写,编译器能解析的模板,就是正确的模板。一般来说,只要是能推导的,都能编译通过。模板的语法,可以在尝试中探索和掌握。

  • 总体来说,编译期的泛型编程和C/C++逻辑基本上是一致的,只是泛型编程的核心是类型,类型就是泛型编程中的变量。一定要掌握核心逻辑才能学的轻松。

2.4 万能引用
  • 万能引用,只有两种使用场景,一是函数模板与完美转发,二是 auto &&。
    目前C++中一共有三种引用:左值引用,右值引用,万能引用。一句话理解万能引用:只要你用了万能引用,编译器就会向上找这个引用最原始的来源,从而确定,这个万能引用,到底是左值引用来使用,还是作为右值引用来使用。专业术语,叫引用折叠,不理解的话是真的不好懂。
2.5 萃取
  • 萃取,就是由类型匹配机制,推导出另外一种类型,或者推导出一个值,前者叫类型萃取,后者叫值萃取。当然要看书中的例子,不然这句话肯定是无法理解的。
  • 萃取,实际上就是分支判断。利用萃取中的SFINAE,就可以编写很多编译期的判断函数模板、判断类模板,一起组成编译期函数库,用来实现更加复杂的模板逻辑。
2.6 高大上词汇
  • 显式具体化:就是全特化,因为全特化后的模板,不需要推导,它就是一个实实在在可以被编译到cpp中的函数,或类,或变量。它的声明需要被写到头文件中,实现需要被写到cpp中,如果写在头文件中可能会出现重定义错误。

  • 显式实例化:就是给某个模板传递好类型参数,一旦类型确定,模板就被实例化成可以被编译到cpp中的函数,或类,或变量。显示具体化和显式实例化本质上是一样的,显式具体化是通过全特化写法实现的;显式实例化,是通过传递具体的类型参数,将模板实例化得到的。显式实例化只需要写到cpp中。

  • 隐式实例化:在模板使用的时候,传递确定的类型参数,这个时候,编译器会自动生成代码,不需要开发者参与,所以叫隐式实例化。

2.7 元编程

类模板,函数模板等都是元编程。

需要特别注意的元函数是,通过递归的方式生成内联代码的元函数。

通过递归生成代码机制,可以实现变长的类型列表(typelist),变长的多类型容器(tuple)。这个太绕,暂时知道即可,需要用的时候再仔细研究吧。

2.8 标准模板库的实现原理

一般开发中我们是学者怎么用标准模板库写业务代码,而比较少能看懂标准模板库的代码,书中这一块有具体讲解,可以当作闲暇读物。


入门篇完结。

相关文章:

模板与泛型编程笔记(一)入门篇

1. 推荐书籍 《C新经典 模板与泛型编程》难得的很容易看得懂的好书&#xff0c;作者讲技术不跳跃&#xff0c;娓娓道来&#xff0c;只要花点时间就能看懂。 2. 笔记 2.1 模板基础 模板为什么要用尖括号&#xff1f;因为便于编译器解析&#xff0c;可以将模板和普通函数声明…...

浅谈WebApi

一、基本介绍 Web API&#xff08;Web应用程序编程接口&#xff09;是一种用于构建应用程序的接口&#xff0c;它允许软件应用程序通过HTTP请求与Web服务器进行交互。Web API通常用于构建客户端-服务器应用程序&#xff0c;其中客户端可以是Web浏览器、移动应用程序、桌面应用程…...

9月14日,每日信息差

第一、宝马集团宣布对设计部门进行重组&#xff0c;并将于 2024 年 10 月 1 日成立一个跨品牌设计团队&#xff0c;由范・霍伊顿克领导。该团队将引入极星汽车设计主管马克西米利安・米索尼&#xff0c;负责宝马中高档和豪华车型以及宝马 Alpina 的设计工作。 第二、小鹏汇天飞…...

无人机控制与三维AI感知处理平台正式上线!

低空经济被誉为推动我国经济高质量发展的全新增长引擎&#xff0c;是一种以民用有人驾驶和无人驾驶航空器的各类低空飞行活动为牵引&#xff0c;辐射带动相关领域融合发展的综合性经济形态&#xff0c;2024年全国两会首次被纳入政府工作报告。 大势智慧积极响应国家低空经济政…...

9.11-kubeadm方式安装k8s

一、安装环境 编号主机名称ip地址1k8s-master192.168.2.662k8s-node01192.168.2.773k8s-node02192.168.2.88 二、前期准备 1.设置免密登录 [rootk8s-master ~]# ssh-keygen [rootk8s-master ~]# ssh-copy-id root192.168.2.77 [rootk8s-master ~]# ssh-copy-id root192.168…...

限流,流量整形算法

写在前面 源码 。 本文看下流量整形相关算法。 目前流量整形算法主要有三种&#xff0c;计数器&#xff0c;漏桶&#xff0c;令牌桶。分别看下咯&#xff01; 1&#xff1a;计数器 1.1&#xff1a;描述 单位时间内只允许指定数量的请求&#xff0c;如果是时间区间内超过指…...

【C++知识扫盲】------C++ 中的引用入门

在 C 中&#xff0c;引用&#xff08;reference&#xff09; 是一个非常重要的概念&#xff0c;它提供了一种别名机制&#xff0c;让我们可以给已经存在的变量起一个新的名字&#xff0c;并且能够通过这个别名直接操作原始变量。本文将详细介绍引用的定义、使用场景及其与指针的…...

【机器学习】6 ——最大熵模型

机器学习6——最大熵模型 目录 机器学习6——最大熵模型最大熵&#xff08;maximum entropy&#xff09;模型模型模型学习&#xff08;估计参数&#xff09;模型评价应用 最大熵&#xff08;maximum entropy&#xff09;模型 选择熵最大的概率模型 熵是衡量不确定性的&#xf…...

小程序——生命周期

文章目录 运行机制更新机制生命周期介绍应用级别生命周期页面级别生命周期组件生命周期生命周期两个细节补充说明总结 运行机制 用一张图简要概述一下小程序的运行机制 冷启动与热启动&#xff1a; 小程序启动可以分为两种情况&#xff0c;一种是冷启动&#xff0c;一种是热…...

基于微信小程序的宠物之家的设计与实现

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 基于微信小程序JavaSpringBootVueMySQL的宠物之家/宠物综合…...

自定义EPICS在LabVIEW中的测试

继续上一篇&#xff1a;LabVIEW中EPICS客户端/服务端的测试 变量定义 You can use CaLabSoftIOC.vi to create new EPICS variables and start them. CA Lab - LabVIEW (Realtime) EPICS INPUT: PV set Cluster-array of names, data types and field definitions to crea…...

基于深度学习的农作物病害检测

基于深度学习的农作物病害检测利用卷积神经网络&#xff08;CNN&#xff09;、生成对抗网络&#xff08;GAN&#xff09;、Transformer等深度学习技术&#xff0c;自动识别和分类农作物的病害&#xff0c;帮助农业工作者提高作物管理效率、减少损失。 1. 农作物病害检测的挑战…...

【C#】命名规范

文章目录 C# 命名规范使用Pascal case使用Camel case方法、属性、类命名见名知义LINQ查询变量使用有意义的名称如何声明成员变量和字段正确格式化和缩进代码如何撰写备注 通用C#编码最佳实践如何将值与空字符串进行比较使用异常处理使用&&和||可获得更好的性能单一职责…...

超级帐本(Hyperledger)

1. Hyperledger 项目 Hyperledger 下有两类项目:第一类是区块链框架项目;第二类是支持这些区块链的相关工具或模块。 在 Hyperledger 框架下&#xff0c;目前有 5 个区块链框架项目&#xff1a;Fabric、Sawtooth Lake、Iroha、Burrow 和 Indy。 在模块类下&#xff0c;则有 Hyp…...

如何精细优化网站关键词排名:实战经验分享

在数字营销日益激烈的今天&#xff0c;我深知每一个关键词的排名都关乎着网站的流量与转化。凭借多年的实战经验&#xff0c;我深刻体会到&#xff0c;要想在浩如烟海的网络世界中脱颖而出&#xff0c;精细化的关键词优化策略至关重要。今天&#xff0c;我将从实战角度出发&…...

Ruoyi Cloud 本地启动

本文视频版本&#xff1a;https://www.bilibili.com/video/BV1SNtueBE9M 参考 http://doc.ruoyi.vip/ https://gitee.com/y_project/RuoYi-Cloud https://blog.csdn.net/cs_dnzk/article/details/135289966 https://doc.ruoyi.vip/ruoyi-cloud/cloud/seata.html#%E5%9F%BA%E6…...

Nginx解析:入门笔记

&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索nginx之旅✨ &#x1f44b; 大家好&#xff01;文本学习和探索Nginx配置。…...

在 Mac 上安装双系统会影响性能吗,安装双系统会清除数据吗?

在 Mac 系统安装并使用双系统已经成为了许多用户办公的选择之一&#xff0c;双系统可以让用户在 Mac 上同时运行 Windows 或其他操作系统。然而&#xff0c;许多用户担心这样做会对 Mac 的性能产生影响。 接下来将给大家介绍 Mac 装双系统会影响性能吗&#xff0c;Mac装双系统…...

vue3提交按钮限制重复点击

下载lodash npm install lodash 引入并使用 <template><div click"submit()">提交</div> </template><script setup>import { debounce } from lodash;const submit debounce(() > {//业务代码},2000,{leading: true,trailing:…...

Java | Leetcode Java题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution {public int longestSubstring(String s, int k) {int ret 0;int n s.length();for (int t 1; t < 26; t) {int l 0, r 0;int[] cnt new int[26];int tot 0;int less 0;while (r < n) {cnt[s.charAt(r) - a];…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...