[原創](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.pswp.cn/web/71486.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/71486.shtml
英文地址,請注明出處:http://en.pswp.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…