【现代C++】概念的使用

在这里插入图片描述

现代C++(特别是C++20及以后的版本)引入了概念(Concepts),这是一种指定模板参数必须满足的约束的方式。概念使得模板代码更清晰,更容易理解和使用,并且能在编译时提供更好的错误信息。以下是C++概念的关键特性和使用示例:

1. 基本概念使用

概念定义了模板参数必须满足的一组约束。

#include <concepts>
#include <iostream>template<typename T>
requires std::integral<T>  // 基本概念
T add(T a, T b) {return a + b;
}void basicConcept() {std::cout << add(1, 2) << std::endl;  // 正确// std::cout << add(1.1, 2.2) << std::endl;  // 错误,浮点数不满足std::integral概念
}

2. 自定义概念

你可以定义自己的概念,以表达更复杂的约束。

#include <iostream>template<typename T>
concept Addable = requires(T a, T b) {{ a + b } -> std::convertible_to<T>;
};template<typename T>
requires Addable<T>  // 使用自定义概念
T add(T a, T b) {return a + b;
}void customConcept() {std::cout << add(3, 4) << std::endl;  // 正确
}

3. 概念与函数重载

概念可以与函数重载一起使用,让编译器根据概念选择合适的函数版本。

#include <iostream>
#include <concepts>template<typename T>
requires std::integral<T>
void process(T value) {std::cout << "Processing integral: " << value << std::endl;
}template<typename T>
requires std::floating_point<T>
void process(T value) {std::cout << "Processing floating point: " << value << std::endl;
}void conceptWithOverloading() {process(10);    // 调用处理整数的版本process(10.5);  // 调用处理浮点数的版本
}

4. 概念在类模板中的应用

概念同样可以用在类模板的定义中,限制模板参数的类型。

#include <iostream>
#include <vector>
#include <concepts>template<typename T>
requires std::integral<T>
class Numbers {std::vector<T> values;public:void add(T value) {values.push_back(value);}void print() {for (auto v : values) {std::cout << v << " ";}std::cout << std::endl;}
};void conceptInClassTemplate() {Numbers<int> numbers;numbers.add(1);numbers.add(2);numbers.print();  // 输出:1 2// Numbers<double> decimals;  // 错误,double不满足std::integral概念
}

通过这些示例可以看到概念如何在现代C++中用于指定模板参数的约束,提高代码的可读性、健壮性和易用性。概念为模板编程提供了更清晰的语义和更强的类型检查。

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

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

相关文章

UStaticMesh几何数据相关(UE5.2)

UStaticMesh相关类图 UStaticMesh的数据构成 UStaticMesh的FStaticMeshSourceModel UStaticMesh的Mesh几何元数据来自于FStaticMeshSourceModel&#xff0c; 一级Lod就存在一个FStaticMeshSourceModel. FStaticMeshSourceModel几何数据大致包含以下几类: Vertex(点), VertexI…

【scikit-learn005】支持向量机(Support Vector Machines, SVM)ML模型实战及经验总结(更新中)

1.一直以来想写下基于scikit-learn训练AI算法的系列文章&#xff0c;作为较火的机器学习框架&#xff0c;也是日常项目开发中常用的一款工具&#xff0c;最近刚好挤时间梳理、总结下这块儿的知识体系。 2.熟悉、梳理、总结下scikit-learn框架支持向量机&#xff08;Support Vec…

Maven(项目管理和LINUX)

目录 一、整合IDEA 二、POM模型 三、依赖和继承关系 依赖&#xff08;Dependency&#xff09; 依赖的基本结构 依赖传递性 依赖管理 继承&#xff08;Inheritance&#xff09; 继承的基本结构 继承的特性 四、插件的使用 五、私服的使用 一、整合IDEA 在Maven项目…

基于springboot的医院管理系统源码数据库

基于springboot的医院管理系统源码数据库 随着信息互联网信息的飞速发展&#xff0c;医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求&#xff0c;创建了一个计算机管理医院管理系统的方案。文章介绍了医院管理系…

玩转Matlab-Simscape(初级)- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真(理论部分2)

** 玩转Matlab-Simscape&#xff08;初级&#xff09;- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&#xff08;理论部分2&#xff09; ** 目录 玩转Matlab-Simscape&#xff08;初级&#xff09;- 06 - 基于Solidworks、Matlab Simulink、COMSOL的协同仿真&am…

风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码)完整代码风电功率预测 | 基于GRU门控循环单元的风电功率预测(附matlab完整源码) 完整代码 clc; clear close allX = xlsread(风电场预测.xlsx)

python数据分析——seaborn绘图2

参考资料&#xff1a;活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns tipspd.read_csv(r"...\seaborn常用数据案例\tips.csv") print(tips.head()) 1、成对关系表示 当数据大部分是数据时&#xff0c;可以使用…

分享一个基于Qt的Ymodem的上位机(GitHub开源)

文章目录 1.项目地址2.Ymodem 协议介绍3.文件传输过程4.使用5.SecureCRT 软件也支持Ymodem6.基于PyQt5的Ymodem界面实现案例 1.项目地址 https://github.com/XinLiGH/SerialPortYmodem 基于VS2019 Qt5.15.2 编译&#xff0c;Linux下编译也可以&#xff0c;这里不做说明。 2.…

Python | Leetcode Python题解之第89题格雷编码

题目&#xff1a; 题解&#xff1a; class Solution:def grayCode(self, n: int) -> List[int]:ans [0] * (1 << n)for i in range(1 << n):ans[i] (i >> 1) ^ ireturn ans

如何在云电脑实现虚拟应用—数据分层(应用分层)技术简介

如何在云电脑实现虚拟应用—数据分层&#xff08;应用分层&#xff09;技术简介 近几年虚拟化市场实现了非常大的发展&#xff0c;桌面虚拟化在企业中应用越来越广泛&#xff0c;其拥有的如下优点得到大量企业的青睐&#xff1a; 数据安全不落地。在虚拟化环境下面数据保存在…

STL库简介

一、STL库的概念 STL&#xff1a;是C标准库的重要追组成部分&#xff0c;不仅是一个可以复用的组件库&#xff0c;而且还是一个包含了数据结构和算法的软件框架。 二、STL的版本 原始版本 Alexander Stepanov、 Meng Lee 在惠普实验室完成的原始版本&#xff0c; 是一个开源…

JVM 双亲委派机制详解

文章目录 1. 双亲委派机制2. 证明3. 优势与劣势 1. 双亲委派机制 类加载器用来把类加载到 Java 虚拟机中。从JDK1.2版本开始&#xff0c;类的加载过程采用双亲委派机制&#xff0c;这种机制能更好地保证 Java 平台的安全。 1.定义 如果一个类加载器在接到加载类的请求时&…

react组件渲染性能优化之函数组件-useCallback使用

useCallback主要就是对函数进行缓存,useCallBack这个Hooks主要是解决React.memo不能缓存事件的问题 useCallBack(fn, dependencies) &#xff1a;fn想要缓存的函数&#xff0c;dependencies有关是否更新 fn 的所有响应式值的一个列表 比如&#xff1a;UseCallBackOptimize组件…

(done) NLP+HMM 协作,还有维特比算法

参考视频&#xff1a;https://www.bilibili.com/video/BV1aP4y147gA/?p2&spm_id_frompageDriver&vd_source7a1a0bc74158c6993c7355c5490fc600 &#xff08;这实际上是 “序列标注任务”&#xff09; HMM 的训练和预测如下图 训练过程&#xff1a;我们首先先给出一个语…

做一个桌面悬浮翻页时钟

毛玻璃效果翻页桌面悬浮时钟&#xff0c;TopMost&#xff08;Topmost“True”&#xff09;&#xff0c;不在任务栏显示&#xff08;ShowInTaskbar“False”&#xff09;&#xff0c;在托盘区显示图标&#xff0c;双击托盘区图标实现最小化和还原&#xff0c;右键托盘图标可选“…

常见网络攻击及解决方案

网络安全是开发中常常会遇到的情况&#xff0c;为什么会遇到网络攻击&#xff0c;网络攻击是如何进行的&#xff0c;如何抵御网络攻击&#xff0c;都是我们需要思考的问题。 为什么会遇到网络攻击&#xff1f; 以下是一些主要的因素&#xff1a; 技术漏洞&#xff1a;软件或操…

web学习记录--(5.14)

1.Sublime安装与汉化 直接点击windows即可下载&#xff0c;安装即可 Thank You - Sublime Text 汉化 Install Package ChineseLocalzation 2.PHPstorm下载以及激活,汉化 直接下载&#xff0c;然后找激活码激活即可 汉化 plugins&#xff08;插件&#xff09;/chinese&…

SpringBoot接收参数的19种方式

https://juejin.cn/post/7343243744479625267?share_token6D3AD82C-0404-47A7-949C-CA71F9BC9583

未授权访问:ZooKeeper 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章&#xff1a; 这里附上大…

在Ubuntu中如何解压zip压缩包??

2024年5月15日&#xff0c;周三上午 使用 unzip 命令 unzip 文件名.zip这会将压缩包中的内容解压到当前目录。如果想解压到特定目录&#xff0c;可以使用 -d 选项&#xff0c;例如&#xff1a; unzip 文件名.zip -d 目标目录使用 7-zip 还可以安装 7-zip 工具来解压 ZIP 文件。…