C++20中头文件concepts的使用

      <concepts>是C++20中新增加的头文件,此头文件是concepts库的一部分,主要用于模板编程、泛型编程。包括

      1.core language concepts:

      std::same_as:指定一种类型(type)与另一种类型是否相同。

      std::derived_from:指定一种类型是否派生自另一种类型。

      std::convertible_to:指定一种类型是否可以隐式转换为另一种类型。

      std::common_reference_with:指定两种类型是否共享一个公共的引用类型。

      std::common_with:指定两种类型是否共享一个公共类型。

      std::integral:指定类型是否为整数类型。

      std::signed_integral:指定类型是否为有符号的整数类型。

      std::unsigned_integral:指定类型是否为无符号的整数类型。

      std::floating_point:指定类型是否为浮点类型。

      std::assignable_from:指定一种类型是否可以从另一种类型分配。

      std::swappable、std::swappable_with:指定类型是否可以交换。

      std::destructible:指定该类型的对象是否可以被销毁。

      std::default_initializable:指定类型的对象是否可以默认构造。

      std::move_constructible:指定类型的对象是否可以进行移动构造。

      std::copy_constructible:指定类型的对象可以被拷贝构造和移动构造。

namespace {struct A{int x, y;//A(int x,int y):x(x), y(y) {}bool operator==(const A& other) const{return x == other.x && y == other.y;}//bool operator!=(const A& other) const//{//	return !(*this == other);//}
};struct B{int x, y;auto operator<=>(const B& other) const = default;auto operator()() const{return x % 2 == 0;}
};struct C : public A{C(C&&) = delete;C& operator=(C&&) = delete;
};struct D : private A{int x, y;D() = delete;auto operator()() {return (x + y);}
};using INT = int;
using FLOAT = float;} // namespaceint test_concepts_core_lanuage()
{static_assert(std::same_as<A, B> == false, "A and B are not the same"); // std::is_same_v<T, U>static_assert(std::derived_from<C, A> == true);static_assert(std::derived_from<A, C> == false);static_assert(!std::derived_from<D, A>);static_assert(std::convertible_to<C, A>);static_assert(std::common_reference_with<C, A>);static_assert(std::common_with<C, A>);static_assert(std::integral<INT>);static_assert(!std::integral<FLOAT>);static_assert(std::signed_integral<INT>);static_assert(!std::unsigned_integral<INT>);static_assert(std::floating_point<FLOAT>);static_assert(std::assignable_from<std::string&, std::string>);static_assert(!std::assignable_from<std::string, std::string>);static_assert(!std::assignable_from<std::string, std::string&>);static_assert(std::default_initializable<A>);static_assert(std::move_constructible<B>);static_assert(std::copy_constructible<D>);return 0;
}

      2.comparison concepts:

      std::equality_comparable,std::equality_comparable_with:用于检查指定类型是否支持==运算符。

      std::totally_ordered,std::totally_ordered_with:用于检查指定类型是否支持所有比较操作符。

int test_concepts_comparison()
{static_assert(std::equality_comparable<A>);static_assert(std::equality_comparable<B>);static_assert(std::equality_comparable<C>);static_assert(!std::totally_ordered<A>);static_assert(std::totally_ordered<B>);return 0;
}

      3.object concepts:

      std::movable:指定类型的对象是否可以进行移动构造和swapped。

      std::copyable:指定类型的对象是否可以进行拷贝、移动和swapped。

      std::semiregular:指定类型的对象是否可以进行拷贝、移动、swapped和默认构造。

      std::regular:指定类型是否是regular的,即:

template<class T>
concept regular = std::semiregular<T> && std::equality_comparable<T>;
int test_concepts_object()
{static_assert(std::movable<A>);static_assert(std::movable<B>);static_assert(!std::movable<C>);static_assert(std::copyable<A>);static_assert(std::copyable<B>);static_assert(!std::copyable<C>);static_assert(std::semiregular<A>);static_assert(!std::semiregular<D>);static_assert(std::regular<A>);static_assert(!std::regular<D>);return 0;
}

      4.callable concepts:

      std::invocable、std::regular_invocable:检查给定的可调用对象是否可以被调用,即是否含有operator()。

      std::predicate:指定可调用类型是否是布尔谓词(boolean predicate)。

      std::relation:指定可调用类型是否是二元关系(binary relation)。

int test_concepts_callable()
{static_assert(!std::regular_invocable<A>);static_assert(std::regular_invocable<D>);static_assert(!std::predicate<A>);static_assert(std::predicate<B>);static_assert(!std::relation<A, B, C>);return 0;
}

      5.customization point objects:

      std::ranges::swap:交换两个对象的值。

int test_concepts_customization_point_objects()
{int x{ 1 }, y{ -1 };std::cout << "x=" << x << ", y=" << y << std::endl;std::ranges::swap(x, y);std::cout << "x=" << x << ", y=" << y << std::endl;std::string addr1{ "TianJin" }, addr2{ "BeiJing" };std::cout << "addr1=" << addr1 << ", addr2=" << addr2 << std::endl;std::ranges::swap(addr1, addr2);std::cout << "addr1=" << addr1 << ", addr2=" << addr2 << std::endl;auto print = [](const std::vector<int>& vec) {for (const auto& value : vec)std::cout << value << ",";std::cout << std::endl;};std::vector vec1{ 1, 2, 3 }, vec2{ -1,-2,-3,-4,-5 };std::cout << "vec1: "; print(vec1);std::cout << "vec2: "; print(vec2);std::ranges::swap(vec1, vec2);std::cout << "vec1: "; print(vec1);std::cout << "vec2: "; print(vec2);return 0;
}

      执行结果如下图所示:

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

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

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

相关文章

Apollo Planning2.0决策规划算法代码详细解析 (3):PlanningComponent框架介绍

Apollo Planning 2.0的框架更新涉及多个方面&#xff0c;这些更新旨在提升自动驾驶系统的灵活性、可扩展性和性能。 以下是Apollo Planning 2.0 的框架图&#xff1a; 其中&#xff0c;Apollo的PlanningComponent在自动驾驶系统中扮演着至关重要的角色。其主要作用可以归纳为以…

使用yum为centos系统安装软件以及使用(包含阿里云yum源配置)

centos系统配置阿里云yum源 因为centos7官方停止维护&#xff0c;自带yum源用不了了&#xff0c;所以可以更换成阿里云yum源 方法&#xff1a; 使用root权限执行以下语句 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo CentOS…

番外篇 | 复现AC-YOLOv5,进行自动化织物缺陷检测

前言:Hello大家好,我是小哥谈。我们提出了一种基于AC-YOLOv5的新型纺织缺陷检测方法。将空洞空间金字塔池化(ASPP)模块引入YOLOv5主干网络中,提出了squeeze-and-excitation(CSE)通道注意力模块,并将其引入到YOLOv5主干网络中。🌈 目录 🚀1.基础概念 🚀2.添…

一文上手Kafka【中】

一、发送消息细节 在发送消息的特别注意: 在版本 3.0 中&#xff0c;以前返回 ListenableFuture 的方法已更改为返回 CompletableFuture。为了便于迁移&#xff0c;2.9 版本添加了一个方法 usingCompletableFuture&#xff08;&#xff09;&#xff0c;该方法为 CompletableFu…

【韩顺平Java笔记】第2章:Java概述

按视频的标号来对应小标题&#xff0c;自用学习笔记 文章目录 5. 内容梳理6. 程序举例6.1 什么是程序 7. Java故事7.1 Java诞生小故事7.2 Java技术体系平台 8. Java特性8.1 Java重要特点 9. sublime10. jdk介绍10.1 Java运行机制及运行过程10.1.1 Java虚拟机&#xff08;JVM&a…

【Python】多个dataframe存入excel的不同的sheet表里,而不会被覆盖的方法

我发现&#xff0c;我原来用的多个工作簿存入的方法&#xff0c;发现不太可行&#xff0c;如果我用原来的方法&#xff0c;然后for循环&#xff0c;新的dataframe会把原来的覆盖掉&#xff0c;然后只剩下一个工作薄。原先的代码&#xff1a; with pd.ExcelWriter(file_name ) …

【题解】2022ICPC杭州-K

翻译 原题链接   简述一下就是每次询问重新定义一个字母排序表&#xff0c;问在这个顺序下n个字符串的序列的逆序数是多少。 字典树计算逆序数 先考虑初始状况下&#xff0c;即 a < b < . . . < z a<b<...<z a<b<...<z的情况下&#xff0c;逆序…

[SAP ABAP] 锁对象

在SAP中使用锁对象&#xff0c;用于避免在数据库中插入或更改数据时出现不一致的情况 1.创建锁对象 数据准备 学校表(ZDBT_SCH_437) 使用事务码SE11创建锁对象 点击"锁对象"单选按钮&#xff0c;输入以E开头的锁定对象的名称&#xff0c;然后点击创建按钮 锁对象名…

看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?

看视频都喜欢看高清&#xff0c;那么一般来说看电影不卡顿需要多大带宽呢&#xff1f; 以4K为例&#xff0c;这里引用一位网友的回答&#xff1a;“视频分辨率4092*2160&#xff0c;每个像素用红蓝绿三个256色(8bit)的数据表示&#xff0c;视频帧数为60fps&#xff0c;那么一秒…

基于VUE的在线茶叶购物网站的设计与实现后端SpringBoot数据库MySQL

目录 1. 项目结构规划 2. 技术选型与工具链 3. 关键功能模块设计 4. 数据库设计 5. 安全性考虑 6. 性能优化建议 在开发一个在线茶叶购物网站之前&#xff0c;了解相关的研究背景和技术发展趋势是非常重要的。以下是一些关键点&#xff0c;可以帮助理解该项目的开发背景和…

召回07 双塔模型——正负样本

正样本&#xff1a; 二八法则&#xff0c;少部分物品占据了大多数点击&#xff0c;会导致正样本大多是热门物品。以一定的概率抛弃一些热门物品&#xff0c;抛弃的概率与样本的点击次数正相关。 负样本&#xff1a; 简单负样本 上述简单负样本是从全体样本中抽样。其中&#…

Python编码系列—Python备忘录模式:掌握对象状态保存与恢复技术

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

[Redis][Zset]详细讲解

目录 0.前言1.常见命令1.ZADD2.ZCARD3.ZCOUNT4.ZRANGE5.ZREVRANGE6.ZRANGEBYSCORE7.ZPOPMAX8.BZPOPMAX9.ZPOPMIN10.BZPOPMIN11.ZRANK12.ZREVRANK13.ZSCORE14.ZREM15.ZREMRANGEBYRANK16.ZREMRANGEBYSCORE17.ZINCRBY 2.集合间操作1.有序集合的交集操作2.ZINTERSTORE3.有序集合的并…

H5响应式的文化传媒娱乐公司HTML网站模板源码

源码名称&#xff1a;响应式的文化传媒娱乐公司HTML网站模板源码 源码介绍&#xff1a;一款自适应H5文化传媒娱乐公司官网源码&#xff0c;源码带有6个H5页面&#xff0c;可用于文化传媒和娱乐公司官网。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.51888w.c…

Netty系列-5 Netty启动流程

背景 Netty程序有固定的模板格式&#xff0c;以ServerBootstrap为例: public class NettyServer {public void start(int port) {ServerBootstrap serverBootstrap new ServerBootstrap();EventLoopGroup boosGroup new NioEventLoopGroup(1);EventLoopGroup workGroup ne…

Kubernetes配置管理(kubernetes)

实验环境&#xff1a; 在所有节点上拉取镜像&#xff1b;然后把资源清单拉取到第一个master节点上&#xff1b; 同步会话&#xff0c;导入镜像&#xff1a; configmap/secret 配置文件的映射 变量&#xff1a; 基于valuefrom的方式 cm--》pod 特点&#xff1a;变量的名称可…

[JavaEE] IP协议

目录 一、 IP协议 1.1 基本概念 1.2 协议头格式 1.3 特殊IP 二、 地址管理 2.1 网段划分 2.2 CIDR(Classless Interdomain Routing) 2.3 私有IP地址和公网IP地址 2.4 NAT(Network Address Translation)-网络地址转换 2.5 路由选择 三、数据链路层 3.1 认识以太网 3…

什么是AQS

目录 AQS 介绍 原理 以可重入的互斥锁 ReentrantLock 为例 以倒计时器 CountDownLatch 以例 AQS 资源共享方式 实现自定义同步器 示例 性能优化 AQS 介绍 AQS &#xff08;AbstractQueuedSynchronizer &#xff09;&#xff0c;抽象队列同步器。AQS 是一个功能强大且…

cmd命令大全详解

CMD是Windows操作系统中的命令行解释器&#xff0c;它允许用户通过键入命令来执行各种操作。以下是一些常用的CMD命令及其简要说明&#xff1a; dir - 显示目录中的文件和子目录。 cmddir cd - 更改当前目录。 cmdcd [目录路径] mkdir - 创建新目录。 cmdmkdir [目录名] rmd…

Vue.js 与 Flask/Django 后端配合开发实战

Vue.js 与 Flask/Django 后端配合开发实战 在现代的 Web 开发中&#xff0c;前后端分离已成为一种主流架构&#xff0c;其中前端使用 Vue.js 等流行的框架&#xff0c;后端采用 Flask 或 Django 提供 API 接口。在这种开发模式下&#xff0c;前端负责页面的交互和动态效果&…