concept

concept是给模板添加限制条件,如果条件不符,代码无法通过编译。类似SFINAE的语法糖。

1. 示例一

#include <algorithm>
#include <iostream>
#include <concepts>
#include <type_traits>template<class T>
concept Int = std::same_as<T, int> || std::same_as<T, unsigned>|| std::same_as<T, long> || std::same_as<T, long long>;template<Int T>T plus(T a, T b){return a + b;
}Int auto minus(Int auto a, Int auto b){return a - b;
}int main()
{int a = 9;int b = 8;std::cout << plus(a, b) << std::endl;    // 17std::cout << plus(99, b) << std::endl;   // 107//std::cout << plus(a+0.3, b) << std::endl;std::cout << minus(a, b) << std::endl;   // 1std::cout << minus(99, b) << std::endl;  // 91
}

2. 示例二

2.1 不使用concept进行限制时,square可以传入数字、也可以传入自定义类型

#include <iostream>template<class T>
T square(const T& val){return val * val;
}class Foo{
public:Foo(int val):val_(val){std::cout << "Foo ctor called.\n";}~Foo(){std::cout << "Foo dtor called.\n";}int operator*(const Foo& foo) const {return val_ * foo.val_;}friend std::ostream& operator<<(std::ostream& os, const Foo& foo){os << foo.val_;return os;}private:int val_;
};int main(){std::cout << square(4) << std::endl;std::cout << square(14u) << std::endl;std::cout << square(1.4f) << std::endl;std::cout << square(1.4) << std::endl;Foo foo(5);std::cout << square(foo) << std::endl;
}

输出:

16
196
1.96
1.96
Foo ctor called.
Foo ctor called.
25
Foo dtor called.
Foo dtor called.

2.2 使用concept限制传入的参数必须是数字

// g++ main.cpp -std=c++20 -O2
#include <iostream>
#include <concepts>
#include <type_traits>template<class T>
concept NumberType = std::is_integral_v<T> || std::is_floating_point_v<T>;NumberType auto square(const NumberType auto& val){return val * val;
}class Foo{
public:Foo(int val):val_(val){std::cout << "Foo ctor called.\n";}~Foo(){std::cout << "Foo dtor called.\n";}int operator*(const Foo& foo) const {return val_ * foo.val_;}friend std::ostream& operator<<(std::ostream& os, const Foo& foo){os << foo.val_;return os;}private:int val_;
};int main(){std::cout << square(4) << std::endl;std::cout << square(14u) << std::endl;std::cout << square(1.4f) << std::endl;std::cout << square(1.4) << std::endl;Foo foo(5);//std::cout << square(foo) << std::endl;  // 编译报错error: no matching function for call to 'square(Foo&)'
}

输出:

16
196
1.96
1.96
Foo ctor called.
Foo dtor called.

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

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

相关文章

和鲸科技执行总裁殷自强:面向空间数据协同分析场景的模型生命周期管理方法

导读&#xff1a; 由 ACM SIGSPATIAL 中国分会主办的第五届空间数据智能学术会议&#xff08;SpatialDI 2024&#xff09;于 2024 年 4 月 25 日- 27 日在南京圆满召开&#xff0c;主题为“ AGI 时代下的空间数据智能”&#xff0c;旨在深入推动空间数据智能研究的理论进步与应…

模型实战(23)之 yolov10 使用总结及训练自己的数据集

yolov10 使用总结及训练自己的数据集 0. yolov10 原理分析 此处参考:https://blog.csdn.net/CVHub/article/details/139204248论文:https://arxiv.org/pdf/2405.14458源码:https://github.com/THU-MIG/yolov10 论文原理分析: 创新: 双标签分配策略 众所周知,标签分配策略…

Web前端图片居中:一探究竟的四个方面、五个要点、六大技巧和七大实践

Web前端图片居中&#xff1a;一探究竟的四个方面、五个要点、六大技巧和七大实践 在Web前端开发中&#xff0c;图片居中是一个看似简单却常常让人头疼的问题。无论是在响应式布局中&#xff0c;还是在静态页面中&#xff0c;图片居中都需要考虑到多种因素和技巧。本文将从四个…

Eclipse 重构菜单

Eclipse 重构菜单 Eclipse 是一款广受欢迎的集成开发环境(IDE),它提供了强大的代码编辑、调试和重构功能。在软件开发过程中,重构是一种重要的实践,它可以帮助开发者改进代码结构,提高代码的可读性和可维护性,而不改变其外部行为。Eclipse 的重构菜单包含了多种实用的工…

Sockets (套接字)的使用

Sockets &#xff08;套接字&#xff09;编程是连接网络上两个节点以相互通信的一种方式。一个套接字&#xff08;节点&#xff09;侦听IP上的特定端口&#xff0c;而另一个套接字则连接到另一个。当客户端连接到服务器时&#xff0c;服务器形成侦听器套接字。 1 创建套接字 …

矩阵的迹(Trace)

矩阵的迹&#xff08;Trace&#xff09; flyfish 矩阵的迹&#xff08;Trace&#xff09;是指一个方阵&#xff08;即行数和列数相同的矩阵&#xff09;对角线元素之和。就是在一个正方形的数字表格里&#xff0c;沿着从左上角到右下角的对角线&#xff0c;把这条线上所有的数…

星期六-本周的学习内容全面复习和总结!

本周共学习以下的基础内容&#xff1a; 样本空间和事件的集合表示&#xff1b; 数列极限的定义 随机事件的概率 对于本周的学习内容进行全面复习和总结是一个重要的学习过程&#xff0c;这有助于巩固记忆和提高理解能力。以下是一些步骤和建议&#xff1a; 收集资料&#x…

【嵌入式DIY实例】-Nokia 5110显示DS3231 RTC数据

Nokia 5110显示DS3231 RTC数据 文章目录 Nokia 5110显示DS3231 RTC数据1、硬件准备与接线2、代码实现本文将介绍如何使用 ESP8266 NodeMCU 板和 DS3231 RTC 模块制作一个简单的数字实时时钟,其中可以使用连接到 NodeMCU 的两个按钮设置时间和日期,并将它们打印在诺基亚 5110 …

STM32学习 BKP

BKP就是备份寄存器的意思&#xff0c;听名字就知道它的作用就是用来备份数据的。下面是手册当中的描述。备份寄存器是42个16位的寄存器&#xff0c;可用来存储84个字节的用户应用程序数据。他们处在备份域 里&#xff0c;当VDD电源被切断&#xff0c;他们仍然由VBAT维持供电。当…

【JavaEE精炼宝库】多线程(6)线程池

目录 一、线程池的概念及优势 1.1 线程池的概念&#xff1a; 1.2 线程池的优势&#xff1a; 二、工厂模式 三、标准库中的线程池 3.1 标准库线程池参数解释&#xff1a; 3.1.1 corePoolSize | maximumPoolSize&#xff1a; 3.1.2 keepAliveTime | unit&#xff1a; 3.1…

原型模式--深复制/浅复制

原型模式用于克隆复杂对象&#xff0c;由于new一个实例对象会消耗大部分时间&#xff0c;所以原型模式可以节约大量时间 1 public class Sheep implements Cloneable{2 private String name;3 private Date birth;4 public Sheep(String name, Date birth) {5 …

记一次全设备通杀未授权RCE的挖掘经历

想来上一次挖洞还在一年前的大一下&#xff0c;然后就一直在忙活写论文&#xff0c;感觉挺枯燥的&#xff08;可能是自己不太适合弄学术吧QAQ&#xff09;&#xff0c;所以年初1~2月的时候&#xff0c;有空的时候就又会挖一挖国内外各大知名厂商的设备&#xff0c;拿了几份思科…

【机器学习】基于Transformer架构的移动设备图像分类模型MobileViT

1.引言 1.1. MobileViT是什么&#xff1f; MobileViT是一种基于Transformer的轻量级视觉模型&#xff0c;专为移动端设备上的图像分类任务而设计。 背景与目的&#xff1a; MobileViT由Google在2021年提出&#xff0c;旨在解决移动设备上的实时图像分类需求。与传统的卷积神…

微信小程序的目录结构

微信小程序的目录结构主要包括以下几个部分&#xff0c;这些部分共同构成了小程序的基础框架和页面展示。以下是一个详细的目录结构介绍&#xff1a; 1. 根目录文件 app.js&#xff1a;小程序的主逻辑文件&#xff0c;用于监听并处理小程序的生命周期函数、全局变量等。这个文…

[leetcode] 双指针集锦(python实现)

在解题时&#xff0c;双指针的思想常常可以帮助我们优化解法的时间空间复杂度。接下来&#xff0c;我将通过两道LeetCode的题来给大家讲解双指针的使用方法。 文章目录 题目1&#xff1a;Two Sum题目2&#xff1a;Three Sum双指针思想的总结 题目1&#xff1a;Two Sum 题目描述…

Selenium 定位编辑框有span

当使用Selenium进行网页自动化测试时&#xff0c;定位一个包含span元素的编辑框可能会有些棘手&#xff0c;因为span通常用于对其他HTML元素进行分组或应用样式&#xff0c;而不一定是真正的可输入字段。不过&#xff0c;一旦我们确定了正确的策略&#xff0c;定位编辑框还是相…

AtomicInteger

1. 前言 AtomicInteger是Java中的一个原子整数类&#xff0c;它提供了一种在多线程环境下进行原子性操作的方法。所谓原子性操作是指不会被线程调度机制打断的操作&#xff1b;这些操作可以在可能被其他线程影响的情况下作为一个不可分割的整体执行。 在并发编程中&#xff0…

【Android面试八股文】Android中操作多线程的方式有哪些?

文章目录 1. 使用 `Thread` 和 `Runnable`2. `AsyncTask`3. `Handler` 和 `Looper`4. `HandlerThread`5. `ThreadPoolExecutor`6. `IntentService`7. `RxJava`8. `Coroutine`(协程)9. `WorkManager`在Android开发中,有多种方式可以进行多线程操作。以下是主要的几种方式: 1…

【日常记录】【vue】vite-plugin-inspect 插件的使用

文章目录 1、vite-plugin-inspect2、安装3、使用4、链接 1、vite-plugin-inspect vite-plugin-inspect 可以让开发者在浏览器端就可以看到vue文件编译后的代码、vue文件的相互依赖关系 2、安装 npm i -D vite-plugin-inspect// vite.config.ts import Inspect from vite-plugi…

LeetCode题练习与总结:最长连续序列--128

一、题目描述 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1&#xff1a; 输入&#xff1a;nums [100,4,200,1,3,2] 输出&…