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

news2024/9/28 19:21:16

      <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;

} // namespace

int 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.coloradmin.cn/o/2174524.html

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

相关文章

学习之什么是装饰器

什么是装饰器 本质&#xff1a;就是一个函数&#xff0c;能为其它的函数增加额外功能 # 目标函数 def power_num(n):"""计算并返回1-n之间每个数的平方和:param n::return:"""total 0for i in range(1, n1):total i ** 2"""…

【网络安全】-访问控制-burp(1~6)

文章目录 前言   1.Lab: Unprotected admin functionality  2.Lab: Unprotected admin functionality with unpredictable URL   3.Lab: User role controlled by request parameter   4.Lab:User role can be modified in user profile  5.Lab: User ID controlled by…

爬虫入门 Selenium使用

爬虫入门 & Selenium使用 特别声明&#x1f4e2;&#xff1a;本教程只用于教学&#xff0c;大家在使用爬虫过程中需要遵守相关法律法规&#xff0c;否则后果自负&#xff01;&#xff01;&#xff01; 项目代码&#xff1a;https://github.com/ziyifast/ziyifast-code_inst…

systemd-analyze命令:Linux系统启动分析

一、命令简介 用途: systemd-analyze ​命令用于分析系统引导过程的时间性能。标签: 系统管理&#xff0c;性能分析。相关命令: systemd-bootchart​, systemd-cgtop​, systemd-resolve​. ‍ 二、命令参数 命令格式 systemd-analyze [OPTIONS...] COMMAND ...选项和参数…

GUI-Guider LVGL 添加自定义代码

添加自定义代码时&#xff0c;分为上线两端 1.上部分可有可无 2.下部分为你触发事件时调用的语句 具体集合下方图片 示例参考

运放模块的选型参数

增益带宽积-----尤其重要&#xff1a; GWB 增益*带宽 压摆率&#xff1a; 高带宽的运放一般都是电流型运放&#xff1a; 注意压摆率计算公式里面的Vopp参数是放大后的电压最大值&#xff1a; 参数&#xff0c;布局一定参考数据手册&#xff01;&#xff01;&#xff01;&…

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

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

快速理解使用mq(二)——用户、虚拟HOST、Queue的创建

一、用户的创建 直接添加即可 二、虚拟Host创建 创建完成选择所属用户 点进去新建的host 管理对应权限 三、queue 创建 选择对应host 直接添加即可

系统分析师14:需求工程

1 内容概要 2 需求工程概述 需求工程&#xff1a;需求开发【含需求分析】和需求管理系统分析&#xff1a;软件需求分析、硬件需求分析、网络需求分析软件需求是指用户对系统在功能、行为、性能、设计约束等方面的期望考虑“做什么”&#xff0c;而不考虑“怎么做”&#xff0c…

2025 年 IT 前景:机遇与挑战并存,人工智能和云计算成重点

云计算de小白 投资人工智能&#xff1a;平衡潜力与实用性 到 2025 年&#xff0c;人工智能将成为 IT 支出的重要驱动力&#xff0c;尤其是在生成式人工智能领域。人工智能的前景在于它有可能彻底改变业务流程、增强决策能力并开辟新的收入来源。然而&#xff0c;现实情况更加微…

4款工具搞定PDF去水印,线上+软件一应俱全!

作为一名文员&#xff0c;我每天都得和各种文档打交道&#xff0c;其中PDF文件是最常见的。有时候&#xff0c;我们收到的PDF文件会带有水印&#xff0c;这不仅影响了阅读体验&#xff0c;还可能在分享时造成不便。所以&#xff0c;学会如何去除PDF水印对我来说至关重要。今天&…

力扣 滑动窗口最大值

滑动窗口最大值 题目描述 题目分析 维护一个定长窗口的最大值&#xff0c;每当窗口滑动时都有一个新的元素进入和一个原有的元素离开。 比较简单的方法就是用一个优先队列维护窗口最大值 但是堆的计算成本时最坏时是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 优化&#xff1a;…

uni-app在线预览pdf

这里推荐下载pdf.js 插件 PDF.js - Browse Files at SourceForge.net 特此注意 如果报 Promise.withResolvers is not a function 请去查看版本兼容问题 降低pdf.js版本提高node版本 下载完成后 在 static 文件夹下新建 pdf 文件夹&#xff0c;将解压文件放进 pdf 文件…

面试加分必看,11道接口安全测试面试题!

今天&#xff0c;分享一些在面试中可能会遇到的接口安全测试面试问题&#xff0c;助你在面试中从容不迫。 01.HTTPS 与 HTTP 的区别&#xff1f; 02.OSI七层模型是指&#xff1f; 03.你所知道的 HTTP 状态码&#xff1f; 04.你知道SQL注入吗&#xff1f; 05.SQL 注入与XSS…

Xiaojie雷达之路---doa估计(dbf、capon、music算法)

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,本篇文章主要是介绍一下雷达信号处理中的dbf、capon、music测角算法,一起来看看吧!!! 前言 本文从信号模型、dbf原理、capon原理、music原理以及代码仿真进行展开描述。 信号模型 阵列接收到…

c++与Python用笛卡尔的心形函数输出爱心

我突然想到输出爱心是否可以用笛卡尔的心形函数 在IDLE里用Python输出下面这个图形 在小熊猫c里用c输出下面这个图形 如果当你要输出这些的时候会怎么办 低级:纯输出 print( ********* ********* ***************** ***************** …

Github + Hexo + Shoka搭建个人博客以及遇到的部分问题

博客预览&#xff1a; 主页&#xff1a; 文章&#xff1a; 博客语言链接&#xff1a; 全部分类 |mmjon 不在能知&#xff0c;乃在能行 Shoka官方博客&#xff1a; Yume Shoka 優萌初華 有夢書架 (lostyu.me) 1、准备 1、github账号 &#xff1a;自行去github官网注册…

人生苦短,我用Python✌

面向代码的解释型语言 数据开发和AI 编程语言:让计算机了解我们干什么&#xff0c;翻译官 1.下载软件 解释器安装 点击第二个 改路径 D:\python 安装 测试 winr打开 输入代码 输出 退出环境 exit&#xff08;&#xff09; 新建文本文档后缀改成py 编写 运行 安装编写代码…

MySQL 性能剖析全攻略

在使用 MySQL 数据库的过程中&#xff0c;性能问题往往是让开发者和管理员头疼的难题。为了有效地解决这些问题&#xff0c;我们需要对 MySQL 进行性能剖析。那么&#xff0c;如何在 MySQL 中进行性能剖析呢&#xff1f;本文将为你详细介绍。 一、为什么要进行性能剖析&#x…

$attrs 与 $listeners 怎么用

在组件 son、grandson 和 great-grandson 中都显示了 this is a sentence&#xff0c;而子组件 son 和孙组件 grandson 中都没有定义 props&#xff0c;说明 parent 组件中的数据正确的传递到了内部组件中。 打开控制台&#xff0c;分别点击组件 grandson 和 great-grandson 中…