【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 ...
随机推荐
- appium 遇到连接设备状态是offline
1.查看连接手机设备 adb derivces 时,手机状态是offline状态(无法正常连接). 解决法: 1.adb kill-server 终止adb调试服务 2.adb start-serve ...
- pytorch之科学计算
一.简介 torch作为深度学习的主流框架,其根本在于1.具有强大的GPU加速的张量计算功能.2.包含自动求导系统的深度神经网络.自动求导功能由torch.Autograd模块实现,而科学计算部分则直 ...
- 讨论django并发能力及提供并发解决方案
django 的并发能力真的是令人担忧,这里就使用 nginx + uwsgi 提供高并发 nginx 的并发能力超高,单台并发能力过万(这个也不是绝对),在纯静态的 web 服务中更是突出其优越的地 ...
- mysql 不包含某个字符
转载网址: https://blog.csdn.net/mp624183768/article/details/121696040?utm_medium=distribute.pc_relevant. ...
- CSharp linq 的本质
linq 的本质是扩展方法和委托的结合 链式 linq 和 方法级linq List<int> list = new List<int>() { 3,9,32,7 }; // ...
- TCC 分布式事务解决方案
更多内容,前往 IT-BLOG 一.什么是 TCC事务 TCC 是Try.Confirm.Cancel三个词语的缩写,TCC要求每个分支事务实现三个操作:预处理Try.确认Confirm.撤销Canc ...
- 【Eolink】Apikit V10.8.0 版本发布!增加支持 DUBBO、TCP、SOAP 、HSF、UDP 的接口协议
Apikit 最新功能来袭! 我们在这个版本实现了接口管理和测试能力的全面升级,包括且不限于: 新增功能速览: 增加支持 DUBBO.TCP.SOAP .HSF.UDP 接口文档和协议 接口文档可自动 ...
- 当transcational遇上synchronized
工作当中经常会遇到既需要开启事务管理,同时也需要同步保证线程安全的场景. 比如一个方法 @Transactional public synchronized void test(){ // } 不知道 ...
- MarkdownStudy01markdown用法
一级标题 二级标题 三级标题 字体 Hello,Word! Hello,Word! Hello,Word! Hello,Word! 引用 好好学Java 分割线 图片 超链接 点击跳转 列表 A B ...
- [Java]排序算法>插入排序>【直接插入排序】(O(N*N)/稳定/N较小/有序/顺序存储+链式存储)
1 直接插入排序 1.1 算法思想 插入排序的基本思想是:每一趟将1个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止. 1.2 算法特征 属于[插 ...