C++20中的约束与概念

news2024/9/24 23:22:37

      类模板、函数模板和非模板函数(通常是类模板的成员)可能与约束(constraint)相关联,该约束指定对模板参数的要求(requirements),可用于选择最合适的函数重载和模板特化。约束是使用模板时需要通过模板参数满足的条件或要求。这些要求的命名集合称为概念(concept)。每个概念都是一个谓词(predicate),在编译时进行评估,并成为模板接口的一部分,用作约束。由于在编译时评估约束,因此它们可以提供更有意义的错误消息和运行时安全性。约束是表达式,概念是定义这些表达式的一种方式

      constraint:约束是一系列逻辑运算和操作数,用于指定对模板参数的要求。它们可以出现在要求表达式(requires expressions)中,也可以直接作为概念体(bodies of concepts)出现。requires关键字用于启动requires子句或requires表达式

      约束类型:

      (1),conjunctions:结合了使用与(&&)运算符的多个约束。

      (2).disjunctions:借助或(||)运算符组合的多个约束。

      (3).atomic constraints:特定要求的个体约束。

      以下为测试代码:

namespace {

template<typename T>
requires std::is_integral_v<T> || std::is_floating_point_v<T> void print_value(T value) // requires clause
{
	std::cout << "value is: " << value << std::endl;
}

} // namespace

int test_constraint()
{
	print_value(66);
	//print_value("hello"); // error C2672: "print_value":未找到匹配的重载函数
    print_value(6.6);

	return 0;
}

      执行结果如下图所示:

      concept:概念的目的是模拟语义类别,而不是语法限制。概念是一组命名的要求。概念的定义必须出现在命名空间范围内。概念的定义具有以下形式:

template < template-parameter-list >
concept concept-name attr(optional) = constraint-expression;

      (1).概念不能递归地引用自身,也不能受到约束。

      (2).不允许显式实例化(explicit instantiations)、显式特化(explicit specializations)或概念的部分特化(partial specializations of concepts)(约束的原始定义的含义不能改变)。

      (3).概念可以在id表达式(id-expression)中命名。如果约束表达式满足,则id表达式的值为真,否则为假。

      (4).概念也可以在类型约束(type-constraint)中命名,作为type template parameter declaration, placeholder type specifier, compound requirement的一部分。

      (5).在类型约束中,概念所采用的模板参数比其参数列表要求(demand)的少一个,因为上下文推断的类型被隐式地用作概念的第一个参数。

      以下为测试代码:

namespace {

template<typename T>
concept Integral = std::is_integral_v<T> && sizeof(T) == 4;

template<typename T>
concept unsigned_integral = Integral<T> && !std::is_signed_v<T>;

auto func(Integral auto value)
{
	std::cout << "integer value is: " << value << std::endl;
}

template<typename T>
concept Container = requires(T t) // requires expression
{
    { std::size(t) } -> std::same_as<std::size_t>;
    { std::begin(t) } -> std::same_as<typename T::iterator>;
    { std::end(t) } -> std::same_as<typename T::iterator>;
};

template<Container C>
class ContainerWrapper
{
    // reference: https://www.geeksforgeeks.org/constraints-and-concepts-in-cpp-20/
public:
    ContainerWrapper(C c) : container(c) {}

    void print()
    {
        for (auto it = std::begin(container); it != std::end(container); ++it)
            std::cout << *it << " ";
        std::cout << "; size:" << container.size() << std::endl;
    }

private:
    C container;
};

} // namespace

int test_concept()
{
	func(6);
	//func(6.6); // error C2672: "func":未找到匹配的重载函数
    short val{ 8 };
    //func(val); // error C2672: "func":未找到匹配的重载函数

    std::vector<int> vec1{ 1, 2, 3 };
    ContainerWrapper wrapper1(vec1);
    wrapper1.print();

    std::vector<std::string> vec2{ "hello", "world", "!"};
    ContainerWrapper wrapper2(vec2);
    wrapper2.print();

	return 0;
}

      执行结果如下图所示:

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

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

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

相关文章

Ai+若依(系统接口--Swagger):04篇

Swagger&#xff0c;能够自动生成 API 的同步在线文档&#xff0c;并提供Web界面进行接口调用和测试。 可以直接去测试&#xff1a;--有的接口测试需要权限 我们可以去这样操作 F12 报错404 是因为多了个前缀 /dev-api 我们去后台删掉&#xff1a; 重启刷新&#xff1a;

day 39 代码随想录 | 打家劫舍 动态规划

198.打家劫舍 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个…

Ruby+Watir进行web UI自动化测试

1.新建工程文件 打开RubyMine&#xff0c;新建一个工程文件目录如下&#xff1a; login_mail.rb文件 # encoding:UTF-8 # frozen_string_literal: true当(/^打开谷歌浏览器&#xff0c;进入163邮箱登陆页面$/) do$driver Watir::Browser.new :chromesleep(2)$driver.window.…

裸机:串口通信

串口通信的基本原理 单工通信和双工通信 (1)单工就是单方向&#xff0c;双工就是双方同时收发&#xff0c;同时只能但方向但是方向可以改变叫半双工 (2)如果只能A发B收则单工&#xff0c;A发B收或者B发A收&#xff08;两个方向不能同时&#xff09;叫半双工&#xff0c;A发B收…

【C++】类与对象篇一

【C】类与对象篇一 一 .面向过程和面向对象初步认识二 .类的详解1.类的引入2.类的定义3.类的访问限定符及封装&#xff08;面试题&#xff09;4.类的作用域5.类的实例化6.类对象模型 三 . 结构体内存对齐规则&#xff08;面试题&#xff09;四 . this指针1.this指针的特性2.thi…

WOFOST的web应用

目录 运行可视化 参考链接 https://github.com/irripro/WOFOST_streamlit/tree/main 运行 运行主程序.py之后&#xff0c;得到一串命令 将该命令放到命令台中运行 然后会转到WOFOST的web端上 可视化 目前好像只支持欧洲区域的模拟运行

C++篇:C向C++迈进(上)

引言 C语言作为编程基石&#xff0c;其高效与直接性深受开发者喜爱。然而&#xff0c;随着软件复杂度的增加&#xff0c;C以其面向对象及高级特性成为了新的选择。我们接下来将学习C&#xff0c;从C语言迈向C。 什么是C C 是一种高级语言&#xff0c;由 Bjarne Stroustrup 于…

Docker 的简介

Docker 的简介 为什么会有 Docker环境一致性问题提高资源利用率和可移植性快速部署和伸缩简化管理和维护版本控制和回滚 Docker 的历史dotCloud 时代&#xff08;2010年前&#xff09;Docker 诞生&#xff08;2010-2013&#xff09;快速发展与开源&#xff08;2013-2014&#x…

mysql 日期字段自动填写日期 及自动更新日期

INSERT 时 自动给日期字段 添加 当前日期时间&#xff1a; 在默认里选中&#xff1a; CURRENT_TIMESTAMP UPDATE 时 自动给日期字段 更新 当前日期时间&#xff1a; 勾选&#xff1a;根据当前时间戳更新

通过VIN车架号查询车辆登记日期

我们先来介绍下什么是vin码&#xff0c;以及vin码的构成结构解析&#xff0c;汽车VIN码&#xff0c;也叫车辆识别号码&#xff0c;通俗可以理解为汽车的身份证号码。 接口介绍 通过17位vin码&#xff0c;获取到车辆的发动机号&#xff0c;初登日期&#xff0c;车辆型号等信息。…

CI/CD之Jenkins用于Linux系统的部署方式汇总

目录 一、前言 二、CI/CD的定义与核心原则 CI/CD在现代软件开发中的重要性 CI/CD与Jenkins的关系 三、Jenkins部署方式汇总 1. 独立服务器部署 &#xff08;1&#xff09;离线安装 &#xff08;2&#xff09;在线安装 2. Docker容器部署 3. Kubernetes集群部署 4. 云…

聚焦自闭儿童:关注与理解

在探讨一个三岁自闭症孩子不会说话的情况时&#xff0c;我们首先需要理解自闭症这一复杂神经发育障碍的本质&#xff0c;以及它如何影响儿童的社交互动、沟通能力和行为模式。自闭症不仅仅是一个简单的“不会说话”的问题&#xff0c;而是一系列症状的综合体现&#xff0c;这些…

机器学习:随机森林决策树学习算法及代码实现

1、概念 随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;它通过构建多个决策树来进行分类或回归预测。随机森林的核心原理是“集思广益”&#xff0c;即通过组合多个弱学习器&#xff08;决策树&#xff09;的预测结果来提高整体模型的准确性和健…

基于Java的小区物业管理系统APP的设计与实现(论文+源码)_kaic

摘 要 小区物业管理系统是现代社会中非常热门的软件&#xff0c;伴随着社区规模的不断扩大和住户的不断增多&#xff0c;本系统的主要目的是辞别帐本以及传统的单一数据管理系统&#xff0c;快捷的保存用户各种数据信息。本系统针对Java系统展开&#xff0c;使用Java、SpringB…

tomcat服务器相关搭建

文章目录 web应用服务器tomcatTomcat功能及介绍配置tomcat服务器生成tomcat启动文件 nginx反向代理session共享服务器 web应用服务器tomcat Tomcat功能及介绍 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和…

香橙派AIPro开发板安装PyQt5 aarch64

香橙派AIPro开发板安装PyQt5 参考 开发板信息 官网开发板信息 软件环境信息 1、安装依赖环境 sudo apt-get install cmake gcc g pip3 install --upgrade pip pip3 install wheel setuptools sudo apt-update sudo apt-get install qt5-default sudo apt-get install qtd…

为什么互联网上要设立防火墙?WAF又是什么?

防火墙&#xff08;英语&#xff1a;Firewall&#xff09;技术是通过有机结合各类用于安全管理与筛选的软件和硬件设备&#xff0c;帮助计算机网络于其内、外网之间构建一道相对隔绝的保护屏障&#xff0c;以保护用户资料与信息安全性的一种技术。 防火墙技术的功能主要在于及…

python库(21):

1 TextBlob简介 TextBlob 是一个基于 Python 的文本处理库&#xff0c;能够让基础的自然语言处理任务变得异常简单。 它提供了一个简单直观的 API&#xff0c;让你能够轻松执行词性标注、名词短语提取、情感分析、文本分类和关键词提取等功能。 值得一提的是&#xff0c;Tex…

计算机网络计算题【408】——里昂视频

计算机网络【408】计算题 计算机网络概述【17题】【18题】甘特图【19题】甘特图【20题】【21题】 通信基础【14】求最大传输速率使用两个公式【27】【28】【29】差分曼彻斯特【30】[21]重点 p14 通信基础T31 流量控制与可靠传输机制T21 选择重传协议[GBN]:SR [22][24]***⭐【25…

linux系统使用 docker 来部署web环境 nginx+php7.4 并配置称 docker-compose-mysql.yml 文件

Docker是一个开源的容器化平台&#xff0c;旨在简化应用程序的创建、部署和管理。它基于OS-level虚拟化技术&#xff0c;通过将应用程序和其依赖项打包到一个称为容器的标准化单元中&#xff0c;使得应用程序可以在任何环境中快速、可靠地运行。 Docker的优势有以下几个方面&a…