C++20中的约束与概念

      类模板、函数模板和非模板函数(通常是类模板的成员)可能与约束(constraint)相关联,该约束指定对模板参数的要求(requirements),可用于选择最合适的函数重载和模板特化。约束是使用模板时需要通过模板参数满足的条件或要求。这些要求的命名集合称为概念(concept)。每个概念都是一个谓词(predicate),在编译时进行评估,并成为模板接口的一部分,用作约束。由于在编译时评估约束,因此它们可以提供更有意义的错误消息和运行时安全性。约束是表达式,概念是定义这些表达式的一种方式

      constraint:约束是一系列逻辑运算和操作数,用于指定对模板参数的要求。它们可以出现在要求表达式(requires expressions)中,也可以直接作为概念体(bodies of concepts)出现。requires关键字用于启动requires子句或requires表达式

      约束类型:

      (1),conjunctions:结合了使用与(&&)运算符的多个约束。

      (2).disjunctions:借助或(||)运算符组合的多个约束。

      (3).atomic constraints:特定要求的个体约束。

      以下为测试代码:

namespace {template<typename T>
requires std::is_integral_v<T> || std::is_floating_point_v<T> void print_value(T value) // requires clause
{std::cout << "value is: " << value << std::endl;
}} // namespaceint test_constraint()
{print_value(66);//print_value("hello"); // error C2672: "print_value":未找到匹配的重载函数print_value(6.6);return 0;
}

      执行结果如下图所示:

      concept:概念的目的是模拟语义类别,而不是语法限制。概念是一组命名的要求。概念的定义必须出现在命名空间范围内。概念的定义具有以下形式:

template < template-parameter-list >
concept concept-name attr(optional) = constraint-expression;

      (1).概念不能递归地引用自身,也不能受到约束。

      (2).不允许显式实例化(explicit instantiations)、显式特化(explicit specializations)或概念的部分特化(partial specializations of concepts)(约束的原始定义的含义不能改变)。

      (3).概念可以在id表达式(id-expression)中命名。如果约束表达式满足,则id表达式的值为真,否则为假。

      (4).概念也可以在类型约束(type-constraint)中命名,作为type template parameter declaration, placeholder type specifier, compound requirement的一部分。

      (5).在类型约束中,概念所采用的模板参数比其参数列表要求(demand)的少一个,因为上下文推断的类型被隐式地用作概念的第一个参数。

      以下为测试代码:

namespace {template<typename T>
concept Integral = std::is_integral_v<T> && sizeof(T) == 4;template<typename T>
concept unsigned_integral = Integral<T> && !std::is_signed_v<T>;auto func(Integral auto value)
{std::cout << "integer value is: " << value << std::endl;
}template<typename T>
concept Container = requires(T t) // requires expression
{{ std::size(t) } -> std::same_as<std::size_t>;{ std::begin(t) } -> std::same_as<typename T::iterator>;{ std::end(t) } -> std::same_as<typename T::iterator>;
};template<Container C>
class ContainerWrapper
{// reference: https://www.geeksforgeeks.org/constraints-and-concepts-in-cpp-20/
public:ContainerWrapper(C c) : container(c) {}void print(){for (auto it = std::begin(container); it != std::end(container); ++it)std::cout << *it << " ";std::cout << "; size:" << container.size() << std::endl;}private:C container;
};} // namespaceint test_concept()
{func(6);//func(6.6); // error C2672: "func":未找到匹配的重载函数short val{ 8 };//func(val); // error C2672: "func":未找到匹配的重载函数std::vector<int> vec1{ 1, 2, 3 };ContainerWrapper wrapper1(vec1);wrapper1.print();std::vector<std::string> vec2{ "hello", "world", "!"};ContainerWrapper wrapper2(vec2);wrapper2.print();return 0;
}

      执行结果如下图所示:

      GitHub:http://github.com/fengbingchun/Messy_Test

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

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

相关文章

Hadoop 分布式集群搭建

HDFS分布式集群搭建 一、部署规划1.1 进程规划1.2 软件规划1.3 用户规划1.4 目录规划 二、 搭建HDFS 分布式集群2.1 HDFS 集群配置2.1.1 下载安装 Hadoop2.1.2 修改 hadoop-env.sh 配置文件2.1.3 修改 core-site.xml 配置文件2.1.4 修改 hdfs-site.xml 配置文件2.1.5 修改 slav…

程序员:全栈的痛你不知道

上周一个同事直接对我开喷&#xff0c;骂我无能&#xff0c;说&#xff1a;“你怎么一个人就搞不定所有系统呢&#xff1f;”&#xff0c;我半支烟纵横IT江湖14余年&#xff0c;还是第一次被人这么嫌弃。 事情缘由 某公司的业务线特别多&#xff0c;有个业务线前后端项目共计…

在网易云音乐服务器故障事件中提升应急处理能力的探讨

一、事件回顾 2024年8月19日下午&#xff0c;网易云音乐疑似出现服务器故障&#xff0c;导致网页端出现502 Bad Gateway报错&#xff0c;且App也无法正常使用。这一突发事件不仅严重影响了用户体验&#xff0c;还给网易云音乐带来了声誉和经济上的损失。面对这一紧急情况&…

ComfyUI IPAdapter plus的模型应该怎么装-免费版-2024.8.25

&#x1f386;背景 ipadapter相关的节点大家应该都不陌生&#xff0c;具体是做什么的就不详细介绍了&#xff0c;但是还是有很多新入门的朋友不太了解这个节点相关的这一堆模型到底应该怎么安装。这里就借着官方节点的介绍来大概讲下这个话题。 涉及到的节点源地址&#xff1…

python winreg注册表

一、 winreg.OpenKey是winreg模块中的一个函数&#xff0c;用于打开指定的注册表项并返回一个句柄。函数的语法如下&#xff1a;winreg.OpenKey(key, sub_key, res, sam) 参数说明&#xff1a;key&#xff1a;指定要打开的注册表根键&#xff08;如winreg.HKEY_CURRENT_USER、…

Spring的单例模式

1.定义 单例模式&#xff08;Singleton Pattern&#xff09;是一种创建型设计模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。Spring框架默认以单例模式创建Bean&#xff0c;这意味着在Spring容器中&#xff0c;每个Bean定义对应的实例在整个应用程…

【Qt】Qt系统 | Qt事件| 鼠标事件

文章目录 鼠标事件鼠标点击事件鼠标释放事件鼠标双击事件鼠标移动事件 滚轮事件 在 Qt 中&#xff0c;鼠标事件是用 QMouseEvent 实现的。当在窗口中按下鼠标或者移动鼠标时&#xff0c;都会产生鼠标事件 鼠标事件 鼠标点击事件 鼠标按下时通过 虚函数 mousePressEvent() 来…

数学建模学习(118):牛顿冷却定律的原理解析、案例分析与Python求解

介绍来源:2020全国大学生数学建模竞赛论文展示(A070) ,这里我们详细完整的对该优秀论文的方法进行学习和实践。 文章目录 1. 牛顿冷却定律的定义2. 牛顿冷却定律公式3. 牛顿冷却定律的推导4. 牛顿冷却定律的应用方法5. 牛顿冷却定律的验证6. 牛顿冷却定律的图形7. 案例一7.…

线程安全是什么问题?如何引起?死锁是啥?如何解决?

目录 一、什么是线程不安全&#xff1f; 二、如何引起的线程安全&#xff1f;怎么解决&#xff1f; 1&#xff09;CPU调度执行是随机的&#xff0c;抢占式执行&#xff08;根本原因&#xff0c;硬件层面咱们无法干预&#xff09; 2&#xff09;多个线程&#xff0c;对同一变…

服务端事件(Server-Sent Events):实现实时Web通信的利器

标题&#xff1a;服务端事件&#xff08;Server-Sent Events&#xff09;&#xff1a;实现实时Web通信的利器 引言 在现代Web应用中&#xff0c;实现实时通信是一个常见需求。服务端事件&#xff08;Server-Sent Events, SSE&#xff09;是一种允许服务器主动向客户端发送数据…

【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

目录 1- 思路递归 2- 实现⭐105. 从前序与中序遍历序列构造二叉树——题解思路 3- ACM 实现 原题连接&#xff1a;105. 从前序与中序遍历序列构造二叉树 1- 思路 递归 前序&#xff1a;中左右中序&#xff1a;左中右 让前序的第一个元素作为中序的分割点 分割思路 1- 递归…

做个实验

做个实验 #include <bits/stdc.h> using namespace std; #define int long long #define ll __int128_t #define ar array<int, 2> #define arr array<int, 3> int n, m, k, inf 1LL << 61, mod 998244353;// 1e97; const int N 5e5 50;void sol…

使用gitee存储项目

gitee地址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码&#xff1a;https://blog.csdn.net/m0_65520060/article/details/140091437

基于51单片机的百叶窗proteus仿真

地址&#xff1a;https://pan.baidu.com/s/19M6jeTIHJcyDBGNx4H9nTA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

快手怎么免费的去掉视频水印?分享这三个工具给你

​ 我们经常会遇到想要保存的视频带有水印&#xff0c;这不仅影响美观&#xff0c;也不利于分享。为了解决这个问题&#xff0c;我将分享三个免费去除视频水印的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受无干扰的视频体验。 工具一&#xff1a;奈斯水印助手(小程序…

初识MATLAB相关学习笔记

MATLAB的主要功能、应用场景及其相对于其他编程语言的优势和劣势 主要功能 1. 数值计算&#xff1a; 矩阵运算和线性代数。 解微分方程组。 优化算法。 数据插值和拟合。 2. 数据可视化&#xff1a; 2D和3D图形绘制。 图像处理和分析。 动画和GUI构建。 3. 算法开发&#x…

【Linux 从基础到进阶】GlusterFS分布式文件系统搭建

GlusterFS分布式文件系统搭建 引言 随着数据存储需求的快速增长,企业和开发者越来越需要一种高效、可扩展的存储解决方案。GlusterFS是一款开源的分布式文件系统,能够将多个存储服务器组合成一个统一的文件系统,提供高可用性、弹性扩展和性能优化等特性。它可以在标准的以…

数码管进阶设计验证

前言 随着数字电路和嵌入式系统的广泛应用&#xff0c;数码管作为一种常见的显示设备&#xff0c;在各种电子产品中扮演着重要角色。数码管以其结构简单、显示清晰和成本低廉的特点&#xff0c;广泛应用于计数器、时钟、测量仪器等领域。然而&#xff0c;传统的数码管设计通常仅…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…