[原创](Modern C++)现代C++的关键性概念: 利用“概念(Concepts)“,可以优雅地约束模板参数

[作者]
常用网名: 猪头三
出生日期: 1981.XX.XX
企鹅交流: 643439947
个人网站: 80x86汇编小站
编程生涯: 2001年~至今[共24年]
职业生涯: 22年
开发语言: C/C++、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python
开发工具: Visual Studio、Delphi、XCode、Eclipse、C++ Builder
技能种类: 逆向 驱动 磁盘 文件
研发领域: Windows应用软件安全/Windows系统内核安全/Windows系统磁盘数据安全/macOS应用软件安全
项目经历: 磁盘性能优化/文件系统数据恢复/文件信息采集/敏感文件监测跟踪/网络安全检测

[序言]
在现代C++编程中, 尤其是自C++20标准引入以来, 概念(Concepts)作为一项全新特性, 为模板编程带来了革命性的变化. 概念提供了一种直观且优雅的方式来约束模板参数, 使得代码能够清晰地表达模板对参数类型的要求. 这种特性的引入, 不仅增强了代码的可读性和可维护性, 还显著改善了编译时的错误检查能力. 在C++20之前, 模板参数的约束通常依赖于SFINAE(Substitution Failure Is Not An Error)或std::enable_if等技术. 这些方法虽然功能强大, 但实现起来往往复杂繁琐, 且一旦出错, 编译器给出的错误信息晦涩难懂, 调试困难重重. 相比之下, 概念拥有简洁的语法和明确的语义, 同时在类型不匹配时提供更友好的错误提示. 

[代码演示]

#include <iostream>
#include <concepts> // 用于支持概念特性, 例如 std::same_as
#include <io.h>     // 用于 _setmode 函数
#include <fcntl.h>  // 用于 _O_WTEXT 常量// 定义一个函数模板, 使用 std::same_as<T, int> 约束模板参数 T 必须为 int 类型
template<std::same_as<int> T>
void fun_Int(T param_T) {std::wcout << L"The type is int: " << param_T << std::endl;
}// 定义一个函数模板, 使用 std::same_as<T, double> 约束模板参数 T 必须为 double 类型
template<std::same_as<double> T>
void fun_Double(T param_T) {std::wcout << L"The type is double: " << param_T << std::endl;
}int main() {// 设置 stdout 为宽字符模式, 以支持宽字符输出_setmode(_fileno(stdout), _O_WTEXT);fun_Int(42);      // 传递 int 类型参数, 符合 fun_Int 的约束fun_Double(3.14); // 传递 double 类型参数, 符合 fun_Double 的约束// 下面的调用将导致编译错误, 因为 3.14 是 double 类型, 不满足 fun_Int 的约束// fun_Int(3.14); // 错误: 类型不匹配std::cin.get();   // 暂停程序, 等待用户输入return 0;
}

[代码说明]
1. 函数模板fun_Int
   * 使用template<std::same_as<int> T>语法定义了一个函数模板, 其中std::same_as<int>是一个概念, 约束模板参数T必须与int类型完全相同.
   * 函数体内通过std::wcout输出一条消息, 确认传入的参数是int类型, 并显示其值.
   * 例如, 调用fun_Int(42)时, 参数42是int类型, 满足约束, 因此编译和运行正常.

2. 函数模板fun_Double
   * 类似地, template<std::same_as<double> T>约束模板参数T必须是double类型.
   * 调用fun_Double(3.14)时, 参数3.14是double类型, 符合约束, 程序能够正确输出.
   * 如果尝试调用fun_Double(42), 则会因类型不匹配(int不等于double)而导致编译错误.

[总结]
随着C++20及后续标准的广泛采用, 概念(Concepts)将成为现代C++编程中的核心工具之一. 它不仅降低了模板编程的门槛, 还提供了更优雅的解决方案. 无论是编写通用库还是日常开发, 掌握概念(Concepts)都将显著提升代码质量和开发效率.

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

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

相关文章

Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks

Self-Pro: A Self-Prompt and Tuning Framework for Graph Neural Networks ​#paper/GFM/GNN-BASED#​ #paper/⭐⭐⭐#​ 注意&#xff1a;这篇文章是每个图一个GCN模型&#xff0c;而不是所有图一个GCN 模型 算是最早的涉及异配图的prompt了 贡献和动机&#xff1a; 非对…

宝塔 Linux 计划任务中添加运行项目网站PHP任务-定时任务

一、指定php版运行&#xff0c; cd /www/wwwroot/www.xxx.com/ && /www/server/php/56/bin/php think timedtasks start >> /tmp/timedtasks.log 2>&1 二、不指定php版 cd /www/wwwroot/www.xxx.com/ && php think timedtasks start >> …

【电控笔记z29】扰动估测器DOB估测惯量J-摩擦系数B

基本原理 扰动估测器的核心思想是通过向电机系统施加特定的扰动信号&#xff0c;观察系统响应的变化&#xff0c;然后利用系统的动态模型和控制理论来估计未知参数&#xff0c;如惯量和摩擦系数 。一般基于电机的运动方程建立数学模型&#xff0c;结合观测到的电机实际运行数据…

要查看 SQLite 数据库中的所有表,可以通过查询 SQLite 的系统表 sqlite_master

要查看 SQLite 数据库中的所有表&#xff0c;可以查询 SQLite 的系统表 sqlite_master。 每个 SQLite 数据库都包含一个名为 sqlite_master 的系统表。该表定义了数据库的模式&#xff0c;存储了数据库中所有表、索引、视图和触发器等对象的信息。 通过查询 sqlite_master&am…

如何在Spring Boot中读取JAR包内resources目录下文件

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 以下是如何在Spring Boot中读取JAR包内resources目录下文件的教程&#xff0c;分为多种方法及详细说明&#xff1a; 方法1&#xff1a;使用 ClassPathResour…

清华大学DeepSeek赋能家庭教育【附下载链接】

核心要点&#xff1a; DeepSeek通过基础模型&#xff08;V3&#xff09;、深度思考模型&#xff08;R1&#xff09;及联网模型&#xff0c;为家庭教育提供分层支持&#xff1a;V3用于作业辅导&#xff0c;R1培养批判性思维&#xff0c;联网模型助力探究性学习。家长需遵循目标导…

C语言番外篇(5)-------------->作用域与生命周期

作用域与生命周期是非常重要的编程知识。本篇文章使用C语言讲述作用域与生命周期。 一、作用域 在程序设计中&#xff0c;变量并非总是有效的&#xff0c;可以使用的区域就是作用域。 1.1局部变量的作用域 在{}中的都是局部变量&#xff0c;只是作用大小不一样而已。我们可…

若依前后端分离版使用Electron打包前端Vue为Exe文件

1.前言 本文详细介绍如何使用electron将若依框架前后端分离版的前端Vue页面打包为Exe文件&#xff0c;并且包括如何实现应用更新。使用若依基础代码体现不出打包功能&#xff0c;因此我使用开发的文件管理系统&#xff0c;介绍上述过程&#xff0c;具体可以查看我的文章《若依…

Linux——Docker容器内MySQL密码忘记了如何查看

目录 查看正在运行的MySQL的容器ID 方法一&#xff1a;查看MySQL容器的日志里的密码 方法二&#xff1a;通过环境变量密码登录 方法三&#xff1a;修改密码 查看正在运行的MySQL的容器ID docker ps 方法一&#xff1a;查看MySQL容器的日志里的密码 docker logs [MySQL的容器…

康谋分享 | 3DGS:革新自动驾驶仿真场景重建的关键技术

随着自动驾驶技术的迅猛发展&#xff0c;构建高保真、动态的仿真场景成为了行业的迫切需求。传统的三维重建方法在处理复杂场景时常常面临效率和精度的挑战。在此背景下&#xff0c;3D高斯点阵渲染&#xff08;3DGS&#xff09;技术应运而生&#xff0c;成为自动驾驶仿真场景重…

大模型架构记录2

一 应用场景 1.1 prompt 示例 1.2 自己搭建一个UI界面&#xff0c;调用接口 可以选用不同的模型&#xff0c;需要对应的API KEY 二 Agent 使用 2.1 构建GPT

【C++】二叉树相关算法题

一、根据二叉树创建字符串 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有…

【机械视觉】C#+visionPro联合编程———【一、C# + VisionPro 联合编程详解以及如何将visionPro工具加载到winform】

机械视觉与 C# VisionPro 联合编程详解 目录 机械视觉与 C# VisionPro 联合编程详解 概念 应用场景 1. 工业检测与质量控制缺陷检测 2. 定位与机器人引导 3. 识别与分类 4. 复杂流程控制 将visionPro工具加载到winform 环境准备 一、创建winform项目 二、打开窗体…

修改hosts文件,修改安全属性,建立自己的DNS

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

对NXP提供的BSP里边所使用的u-boot的环境变量`bootcmd`的解析

为什么我们要解析环境变量bootcmd&#xff1f; 承接博文 https://blog.csdn.net/wenhao_ir/article/details/145902134 继续解析u-boot的环境变量bootcmd。 为什么要解析u-boot的这个环境变量bootcmd&#xff1f;因为如果u-boot在倒计时完后,首先执行的是就是下面这条命令&am…

NSSCTF [SWPUCTF 2024 秋季新生赛]金丝雀

5948.[SWPUCTF 2024 秋季新生赛]金丝雀 canary绕过和64位的ret2libc(格式化字符串泄露) (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file xn xn: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.…

神经网络中梯度计算求和公式求导问题

以下是公式一推导出公式二的过程。 表达式一 ∂ E ∂ w j k − 2 ( t k − o k ) ⋅ sigmoid ( ∑ j w j k ⋅ o j ) ⋅ ( 1 − sigmoid ( ∑ j w j k ⋅ o j ) ) ⋅ ∂ ∂ w j k ( ∑ j w j k ⋅ o j ) \frac{\partial E}{\partial w_{jk}} -2(t_k - o_k) \cdot \text{sigm…

koa-session设置Cookie后获取不到

在谷歌浏览器中请求获取不到cookie问题之一&#xff08;谷歌安全策略&#xff09; 场景 前端使用 axios 请求&#xff0c;项目地址&#xff1a;http://192.168.8.1:5173 import axios from axiosconst request axios.create({baseURL: http://127.0.0.1:3001/,timeout: 60000,…

单元测试与仿真程序之间的选择

为什么写这篇文章 现在的工作需求&#xff0c;让我有必要总结和整理一下。 凡事都有适用的场景。首先这里我需要提示一下&#xff0c;这里的信息&#xff0c;可能并不普适。 但是可以肯定一点的是&#xff0c;有些人&#xff0c;不论做事还是写书&#xff0c;上下文还没有交待…

如何在Android中实现图片加载和缓存

在Android中实现图片加载和缓存是提升应用性能和用户体验的关键环节。高效的图片加载和缓存策略能够减少内存占用、避免应用卡顿&#xff0c;并快速响应用户的图片查看需求。以下是在Android中实现图片加载和缓存的几种常见方法&#xff1a; 一、使用第三方图片加载库 1. Gli…