【C++】requires关键字简介
requires 是 C++20 中引入的一个新关键字,用于在函数模板或类模板中声明所需的一组语义要求,它可以用来限制模板参数,类似于 typename 和 class 关键字。
requires关键字常与type_traits头文件下类型检查函数匹配使用,当requires后的表达式值为true时满足requires条件,代表由其修饰的函数/类的模板参数合法,可以正常使用
requires 关键字可以用于以下两种情况:
- 在函数模板或成员函数中,使用 requires关键字限制函数模板或成员函数的参数或返回值必须满足一定的语义要求。例如:
template <typename T>
void print(T t) requires std::is_integral_v<T> {
    std::cout << t << std::endl;
}
在这个例子中,使用 requires 关键字限制函数模板参数 T 必须是整数类型。
- 在类模板或成员类中,使用 requires关键字限制类模板或成员类必须满足一定的语义要求。例如:
template <typename T>
requires std::is_integral_v<T>
class IntContainer {
public:
    IntContainer(T t) : value_{t} {}
private:
    T value_;
};
在这个例子中,使用 requires 关键字限制类模板参数 T 必须是整数类型。
需要注意的是,requires 关键字仅能用于函数模板和类模板中,不能用于非模板函数和非模板类。此外,requires 关键字的语义要求必须在编译时可验证,否则将引发编译时错误。
#include <iostream>
class TestRequires
{
public:
    template <typename T>
    static void test(T t)
        requires std::is_integral_v<T>
    {
        std::cout << "test(T t) requires int" << std::endl;
    }
    template <typename T>
    static void test(T t)
        requires std::is_floating_point_v<T>
    {
        std::cout << "test(T t) requires float" << std::endl;
    }
};
int main()
{
    TestRequires::test(123);
    TestRequires::test(1.234);
    return 0;
}
除此之外,requires关键字也可以用于类型转换前的检查(假如函数内需要):
template <typename T>
int64_t unpack(T v) requires std::is_integral<T>::value
{return static_cast<int64_t>(v);}
【C++】requires关键字简介的更多相关文章
- synchronized关键字简介 多线程中篇(十一)
		前面说过,Java对象都有与之关联的一个内部锁和监视器 内部锁是一种排它锁,能够保障原子性.可见性.有序性 从Java语言层面上说,内部锁使用synchronized关键字实现 synchronize ... 
- java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)
		概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ... 
- C语言中的volatile关键字简介
		C语言中的volatile关键字简介: (1)含义: volatile关键字的意思是可能会被外来的意想不到的改变.它的作用是:优化器在使用该关键字定义的变量时,直接从内存中读取原始的数 ... 
- 2、大型项目的接口自动化实践记录--接口测试简介及RequestsLibrary关键字简介
		1.接口测试简介 1)先简单介绍下接口测试,那么什么是接口测试呢? 百科的回答:接口测试是测试系统组件间接口的一种测试.接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点. 看起来有 ... 
- typeof关键字简介 -rtti
		typeof关键字是C语言中的一个新扩展.只要可以接受typedef名称,Sun Studio C 编译器就可以接受带有typeof的结构,包括以下语法类别: 声明 函数声明符中的参数类型链表和返回类 ... 
- Robotframework 之常用断言关键字简介
		任何自动化测试框架或实例中断言是必不可少的,Robotframework同样如此,那下面就介绍下其常用断言关键字. 1.Should Be Empty 判断是否为空,如果不为空,执行失败,示例: ... 
- O-C相关-07-@property关键字简介与使用
		基本概念:在O-C中,创建完类之后还需要给一个类添加属性和方法,之前说过的set和get方法比较繁琐,因此引入了@property 这个编译器指令.@property 是一个编译器指令.所谓的编译器指 ... 
- Oracle中函数关键字简介
		常用的语法:select--from--where--group by--having--order by 1.分组子句group by +con 按什么分组 2.having子句 对上面分组的数据 ... 
- Delphi 关键字详解[整理于 "橙子" 的帖子]
		absolute //它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同. var Str: ]; StrLen: Byte absolute Str; //这个声明指定了变量 ... 
- Java关键字
		Java关键字简介 类别 关键字 说明 访问控制 private 私有的 protected 受保护的 public 公共的 类.方法和变量修饰符 abstract 声明抽象 class 类 exte ... 
随机推荐
- rsync+inotify组合实现实时同步
			首先准备两台服务器(centos7) A:192.168.75.160 B:192.168.75.161 A机器当做客户端,B机器当做服务端 rsync 安装 客户端服务器端都要安装rsync ,但是 ... 
- 一个关于 Linux环境下输出操作符 >和>>的问题
			[>和>>的区别]命令>文件,表示以覆盖的方式,把命令正确输出到指定的文件或者设备当中:命令>>文件,表示以追加的方式,把命令正确输出到指定的文件或者设备当中. [ ... 
- 容灾恢复 | 记一次K8S集群中etcd数据快照的备份恢复实践
			[点击 关注「 全栈工程师修炼指南」公众号 ] 设为「️ 星标」带你从基础入门 到 全栈实践 再到 放弃学习! 涉及 网络安全运维.应用开发.物联网IOT.学习路径 .个人感悟 等知识分享. 希望各位 ... 
- SpringBoot整合RocketMQ案例实战
			一.概念 rocketMQ是一款典型的分布式架构下的中间件产品,使用异步通信方式和发布订阅的消息传输模型,具备异步通信的优势,系统拓扑简单,上下游耦合较弱,主要应用于异步解耦,流量削峰填谷等场景 二. ... 
- mysql基础知识&&常用命令
			了解 什么是数据库?什么是数据管理系统?什么是SQL,他们之间的关系又是什么? 数据库 英文单词DataBase,简称DB,按照一定格式存储数据的一些文件的组合. 顾名思义:存储数据的仓库,实际上就是 ... 
- Racket while循环
			Problem: 1805. 字符串中不同整数的数目 目录 lc题解地址 思路 Code lc题解地址 https://leetcode.cn/problems/number-of-different ... 
- 【公式编辑测试】生成函数常用性质及其他(普通生成函数指数生成函数Dirichlet生成函数)
			目录 定义 普通生成函数OGF 指数生成函数 EGF Dirichlet生成函数 Notation OGF OGF property some OGF instances EGF EGF proper ... 
- Java方法的定义
			前言 经过前面两篇关于面向对象.类和对象的文章,壹哥相信你现在对面向对象已经有了基本的了解.我们知道,在一个类中,包括属性和行为两大核心要素.我们之前已经给大家讲解了如何定义属性,但很多同学对方法还不 ... 
- 教你如何用纯css代码实现太极阴阳鱼动画效果
			今天看到一个有意思的效果,闲来无事做一个: 把2d静态的太极图改成了3d,阴极和阳极分到了两个平面里实现旋转效果,这个好实现,重点是实现它的透明效果,平面太极图显示出两极是用另加的块元素挡住底面的颜色 ... 
- pip更新一直time out 的解决方法
			python -m pip install -U --force-reinstall pip 或者指定安装的镜像, 这里以安装numpy为例,运行pip install numpy -i http:/ ... 
