掌握C++20的革命性特性:Concepts
掌握C++20的革命性特性:Concepts
C++20 的新特性
C++20 引入了 Concepts,这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词,用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编译器错误更易于人类阅读。
我们都遇到过这样的情况:当为类或函数模板提供错误的参数时,编译器会输出数百行错误信息。要从这些编译器错误中找到根本原因并不总是容易的。Concepts 允许编译器在某些类型约束不满足时输出更易读的错误消息。因此,为了获得有意义的语义错误,建议编写模拟语义要求的 Concepts。避免仅针对语法方面而没有任何语义意义的 Concepts 验证,例如,仅检查类型是否支持 operator+ 的 Concept。这样的 Concept 只会检查语法,而不是语义。例如 std::string 支持 operator+,但显然,它与整数的 operator+ 有完全不同的含义。另一方面,如 sortable(可排序)和 swappable(可交换)等 Concepts 是模拟一些语义意义的好例子。
注意:编写 Concepts 时,请确保它们模拟语义,而不仅仅是语法。
Concepts 的语法
定义 Concepts 的通用语法如下:
template <parameter-list> concept concept-name = constraints-expression;
它以熟悉的 template<> 规范开始,但与类和函数模板不同,Concepts 永远不会被实例化。接下来,使用一个新关键字 concept,后跟 Concept 的名称。你可以使用任何你想要的名称。constraints-expression 可以是任何常量表达式,即任何可以在编译时评估的表达式。约束表达式必须产生布尔值。约束永远不会在运行时评估。约束表达式将在下一节中详细讨论。
Concept 表达式的语法如下:
concept-name<argument-list>
Concept 表达式评估为真或假。如果评估为真,则称给定的模板参数模拟了该 Concept。
Constraints Expression
常量表达式
可直接用作 Concept 定义约束的布尔常量表达式必须精确地计算为布尔值,不进行任何类型转换。例如:
template <typename T>
concept C = sizeof(T) == 4;
Requires 表达式
Requires 表达式的语法如下:
requires (parameter-list) { requirements; }
参数列表是可选的。每个要求必须以分号结束。有四种类型的要求:简单要求、类型要求、复合要求和嵌套要求。
简单要求
简单要求是任意不以 requires 开头的表达式语句。例如,以下 Concept 定义规定了某种类型 T 必须支持后缀和前缀 ++ 操作符:
template <typename T>
concept Incrementable = requires(T x) {x++;++x;
};
类型要求
类型要求验证某种类型是否有效。例如,以下 Concept 要求某种类型 T 具有 value_type 成员:
template <typename T>
concept C = requires {typename T::value_type;
};
复合要求
复合要求用于验证某事物不抛出异常,以及/或验证某个方法返回特定类型。例如,以下 Concept 验证给定类型具有标记为 noexcept 的 swap() 方法:
template <typename T>
concept C = requires (T x, T y) {{ x.swap(y) } noexcept;
};
嵌套要求
Requires 表达式可以包含嵌套要求。例如,这里是一个要求类型大小为 4 字节并支持前缀和后缀增量和减量操作的 Concept:
template <typename T>
concept C = requires (T t) {requires sizeof(t) == 4;++t;--t;t++;t--;
};
Requires 表达式可以有多个参数,并且可以由一系列要求组成。例如,以下 Concept 要求类型 T 的实例是可比较的:
template <typename T>
concept Comparable = requires(const T a, const T b) {{ a == b } -> convertible_to<bool>;{ a < b } -> convertible_to<bool>;// ... 对其他比较操作符的类似要求 ...
};
组合 Concept 表达式
使用逻辑运算符组合
现有的 Concept 表达式可以通过使用逻辑运算符“与”(&&)和“或”(||)来组合。例如,假设您有一个类似于 Incrementable 的 Decrementable Concept;以下示例展示了一个要求类型同时具备增量和减量能力的 Concept:
template <typename T>
concept IncrementableAndDecrementable = Incrementable<T> && Decrementable<T>;
预定义的标准 Concepts
标准库中的 Concepts
标准库定义了一系列预定义的 Concepts,分为多个类别。以下列表给出了每个类别中的一些示例 Concepts,所有这些都在 <concepts> 头文件和 std 命名空间中定义:
- 核心语言 Concepts:
same_as、derived_from、convertible_to、integral、floating_point、copy_constructible等。 - 比较 Concepts:
equality_comparable、totally_ordered等。 - 对象 Concepts:
movable、copyable等。 - 可调用 Concepts:
invocable、predicate等。
此外,<iterator> 头文件定义了与迭代器相关的 Concepts,如 random_access_iterator、forward_iterator 等,还定义了算法要求,如 mergeable、sortable、permutable 等。
C++20 范围库还提供了一些标准 Concepts。第17章《理解迭代器和范围库》详细讨论了迭代器和范围,而第20章更深入地探讨了标准库提供的算法。
使用标准 Concepts
如果这些标准 Concepts 满足您的需求,您可以直接使用它们,无需自己实现。例如,以下 Concept 要求类型 T 是从类 Foo 派生的:
template <typename T>
concept IsDerivedFromFoo = derived_from<T, Foo>;
以下 Concept 要求类型 T 可以转换为 bool:
template <typename T>
concept IsConvertibleToBool = convertible_to<T, bool>;
这些标准 Concepts 也可以组合成更具体的 Concepts。例如,以下 Concept 要求类型 T 既是默认构造的也是可拷贝构造的:
template <typename T>
concept DefaultAndCopyConstructible = default_initializable<T> && copy_constructible<T>;
注意:编写完整且正确的 Concepts 并不总是容易的。如果可能,尝试使用现有的标准 Concepts 或它们的组合来约束您的类型。
相关文章:
掌握C++20的革命性特性:Concepts
掌握C20的革命性特性:Concepts C20 的新特性 C20 引入了 Concepts,这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词,用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编…...
win11开机后频繁刷新桌面,任务栏不显示,文件资源管理器explorer报错ntdll.dll
win11 开机后桌面频繁刷新,cpu 暴涨,任务栏不出现。 不知道是安装了什么软件还是系统升级造成的,好长时间不重启电脑了,然后重启了下电脑。 结果就是: 现象描述 重启后 输入密码进入后 变得巨慢。好久才进入的桌面。…...
解决Git添加.gitignore文件后不生效的问题
1. 问题描述 如上图所示,在已存在.gitignore文件且已经提交过的Git管理的项目中,其中.class、.jar文件以及.idea目录内的内容全部都还是被Git管理了,可见.gitignore文件并没有生效。 2. 原因发现 .gitignore文件只能作用于 Untracked Files…...
Shell Linux学习笔记
注意:该文章摘抄之百度,仅当做学习笔记供小白使用,若侵权请联系删除! 目录 什么是shell ? Linux正则匹配 grep tar与unzip echo history 重定向 shell 单双引号 位置参数 预定义变量 运算 正则表达式 字符截取命令 …...
kingbase常用SQL总结之锁等待信息
锁信息与等待事件 分析kingbase(pg)数据库锁等待、死锁时需要我们准确的定位等锁或者死锁相关的事务。关于获取锁等待信息或者死锁信息已有经典的SQL可以直接使用,但是需要我们先了解sql语句获取的每个字段的意义。 获取到锁等待事务不能完全…...
「优选算法刷题」:长度最小的子数组
一、题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, ..., numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。 示例 1: 输…...
RuoYi-Cloud本地部署--详细教程
文章目录 1、gitee项目地址2、RuoYi-Cloud架构3、本地部署3.1 下载项目3.2 idea打开项目3.3 启动nacos3.4 若依数据库准备3.5 启动redis3.6 修改nacos中的各个模块的配置文件3.7 启动ruoyi前端项目3.8 启动各个微服务模块 4、启动成功 1、gitee项目地址 https://gitee.com/y_p…...
如何优雅的发布一个 TypeScript 软件包?
向 NPM 发布软件包本身并不是一个特别困难的挑战。但是,配置你的 TypeScript 项目以取得成功可能是一个挑战。你的软件包能在大多数项目上运行吗?用户能否使用类型提示和自动完成功能?它能与 ES Modules (ESM) 和 CommonJS (CJS) 风格的导入一…...
总结的太到位:python 多线程系列详解
前言: 上vip课的时候每次讲到框架的执行,就会有好学的同学问用多线程怎么执行,然后我每次都会说在测开课程会详细讲解,这并不是套路,因为如果你不理解多线程,不清楚什么时候该用什么时候不该用,…...
惬意上手Python —— 装饰器和内置函数
1. Python装饰器 Python中的装饰器是一种特殊类型的函数,它允许用户在不修改原函数代码的情况下,增加或修改函数的行为。 具体来说,装饰器的工作原理基于Python的函数也是对象这一事实,可以被赋值给变量、作为参数传递给其他函数或者作为其他…...
python 调用dll
在Python中,可以使用ctypes库来调用DLL文件。ctypes库是一个标准库,用于在Python中加载共享库(例如DLL文件)并调用其中的函数。 以下是一个简单的示例,演示如何使用ctypes库调用DLL文件中的函数: import c…...
docker里Java服务执行ping命令模拟流式输出
文章目录 业务场景处理解决实现ping功能并实时返回输出实现长ping和中断请求docker容器找不到ping命令处理 业务场景 我们某市的客户,一直使用CS版本的信控平台,直接安装客户Windows server服务器上,主要对信号机设备进行在线管理、方案配时…...
代码随想录算法训练营第十三天| 239. 滑动窗口最大值 、347.前 K 个高频元素
239. 滑动窗口最大值 思路: 用遍历区间的元素时,维护一个单调队列,从大到小排列。 要找到最大值,实际单调队列保存区间内最大值及最大值右侧的第二大值(用于当前最大值处于区间左端,在区间右移时更新临时最…...
旋转花键的使用寿命与机械原理分析
旋转花键是一种传动部件,广泛应用于各种机械设备中。对于厂商来说,如何保证使用寿命是重中之重,而旋转花键的使用寿命与其机械原理密切相关,了解其机械原理有助于更好地维护和使用旋转花键,从而提高其使用寿命。 旋转花…...
互联网摸鱼日报(2024-01-22)
互联网摸鱼日报(2024-01-22) 开源中国资讯 Stability AI 推出更小、更高效的 1.6B 语言模型 X 正面向 Android 推出音频和视频通话 Extism —— WebAssembly 插件实现框架 Gitee 推荐 | 龙蜥社区最佳安全加固实践指南 security-benchmark 每日一博 | 得物云原生容器技术探…...
CentOS 7 安装配置MySQL
目录 一、安装MySQL编辑编辑 1、检查MySQL是否安装及版本信息编辑 2、卸载 2.1 rpm格式安装的mysql卸载方式 2.2 二进制包格式安装的mysql卸载 3、安装 二、配置MySQL 1、修改MySQL临时密码 2、允许远程访问 2.1 修改MySQL允许任何人连接 2.2 防火墙的问题 2…...
Gold-YOLO(NeurIPS 2023)论文与代码解析
paper:Gold-YOLO: Efficient Object Detector via Gather-and-Distribute Mechanism official implementation:https://github.com/huawei-noah/Efficient-Computing/tree/master/Detection/Gold-YOLO 存在的问题 在过去几年里,YOLO系列已经…...
多个coco数据标注文件合并
一、coco数据集是什么? COCO(Common Objects in Context)是一个用于目标检测和图像分割任务的标注格式。如果你有多个COCO格式的JSON文件,你可能需要将它们合并成一个文件,以便更方便地处理和管理数据。在这篇博客中&…...
Kubernetes(K8S)拉取本地镜像部署Pod 实现类似函数/微服务功能(可设置参数并实时调用)
以两数相加求和为例,在kubernetes集群拉取本地的镜像,实现如下效果: 1.实现两数相加求和 2.可以通过curl实时调用,参数以GET方式提供,并得到结果。(类似调用函数) 一、实现思路 需要准备如下的…...
k8s使用ingress实现应用的灰度发布升级
v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx,来测试灰度发布实现过程 一、方案:使用ingress实现应用的灰度发布 1、服务端:正常版本v1,灰度升级版本v2 2、客户端:带有请求头versionv2标识的请求访问版…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...
Mysql故障排插与环境优化
前置知识点 最上层是一些客户端和连接服务,包含本 sock 通信和大多数jiyukehuduan/服务端工具实现的TCP/IP通信。主要完成一些简介处理、授权认证、及相关的安全方案等。在该层上引入了线程池的概念,为通过安全认证接入的客户端提供线程。同样在该层上可…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...
Win系统权限提升篇UAC绕过DLL劫持未引号路径可控服务全检项目
应用场景: 1、常规某个机器被钓鱼后门攻击后,我们需要做更高权限操作或权限维持等。 2、内网域中某个机器被钓鱼后门攻击后,我们需要对后续内网域做安全测试。 #Win10&11-BypassUAC自动提权-MSF&UACME 为了远程执行目标的exe或者b…...
