c++20 Concepts的簡寫形式與requires 從句形式

c++20 Concepts的簡寫形式與requires 從句形式

      • 原始寫法(簡寫形式)
      • 等效寫法(requires 從句形式)
      • 關鍵區別說明:
      • 組合多個約束的示例:
      • 兩種形式的編譯結果:
      • 更復雜的約束示例:
      • 標準庫風格的約束:

在 C++20 Concepts 中,使用簡寫形式的 template<ConceptName T> 與使用完整形式的 template<typename T> requires ConceptName<T> 是等價的。以下是兩種寫法的具體轉換:

原始寫法(簡寫形式)

template<typename T>
concept Arithmetic = std::is_arithmetic_v<T>;template<Arithmetic T>  // 簡寫形式
T add(T a, T b) { return a + b; }

等效寫法(requires 從句形式)

template<typename T>
concept Arithmetic = std::is_arithmetic_v<T>;template<typename T>    // 完整形式
requires Arithmetic<T>  // requires 從句
T add(T a, T b) { return a + b; }

關鍵區別說明:

特征簡寫形式requires 從句形式
語法結構template<ConceptName T>template<typename T> requires ...
可組合性只能指定單個 Concept可通過邏輯運算符組合多個約束
約束表達式位置模板參數聲明中模板參數列表后的 requires 從句中
適用場景簡單約束復雜約束(需要組合多個條件時)

組合多個約束的示例:

template<typename T>
concept Signed = std::is_signed_v<T>;template<typename T>
requires Arithmetic<T> && Signed<T>  // 組合兩個約束
T negative(T value) {return -value;
}negative(5);     // OK
negative(3.14);  // OK
negative("123"); // 錯誤:不滿足 Arithmetic 約束
negative(2u);    // 錯誤:unsigned 不滿足 Signed 約束

兩種形式的編譯結果:

  1. 錯誤信息對比

    add("hello", "world");  // 錯誤信息中會明確顯示:
    // 簡寫形式:"constraints not satisfied for 'T'"
    // requires 從句形式:"constraint 'Arithmetic<T>' was not satisfied"
    
  2. 元編程特性保留

    template<Arithmetic T>      // 兩種形式均可配合
    struct Calculator {         // SFINAE、if constexpr 等特性static_assert(Signed<T>);
    };
    

更復雜的約束示例:

template<typename T>
concept Printable = requires(std::ostream& os, T val) {{ os << val } -> std::same_as<std::ostream&>;
};template<typename T>
requires Arithmetic<T> && Printable<T>
void print_sum(T a, T b) {std::cout << (a + b) << "\n";
}print_sum(3, 5);    // OK:int 是算術類型且可打印
print_sum(2.71, 3); // OK:double 符合條件
print_sum(true, false); // 錯誤:bool 是算術類型但不符合 Printable(需要重載<<)

標準庫風格的約束:

template<typename T>
concept Addable = requires(T a, T b) {{ a + b } -> std::convertible_to<T>;
};template<typename T>
requires Addable<T>  // 替代 C++17 的 std::void_t 技巧
T sum(T a, T b) { return a + b; }

建議:當約束條件簡單時使用簡寫形式,需要組合多個約束或需要更清晰的錯誤信息時使用 requires 從句形式。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897620.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897620.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897620.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

上下分層、左右分離的驅動設計思想

之前了解了最簡單的驅動程序、但是不易擴展、現在繼續學習、上下分層、左右分離的驅動設計思想。 1、led_dev.c函數 上層函數&#xff0c;①定義一個結構體&#xff0c;存儲函數用來接應app的函數。②定義一個入口函數&#xff0c;將我們接應的函數告訴內核&#xff0c;給這個…

人工智能在醫療領域的應用:技術革新與未來展望

人工智能&#xff08;AI&#xff09;技術正在重塑醫療行業的面貌。從輔助診斷到藥物研發&#xff0c;從健康管理到手術機器人&#xff0c;AI的廣泛應用不僅提升了醫療效率&#xff0c;還為精準醫療和個性化治療提供了新可能。根據2025年多份研究報告及政策文件&#xff0c;全球…

《歷史代碼分析》5、動態控制列表的列

?? 本系列《歷史代碼分析》為工作中遇到具有代表性的代碼。今天我們講一下&#xff0c;動態展示列表的列&#xff0c;因為找不到代碼了&#xff0c;所有本篇用圖展示。 舉個栗子 ?? 我們希望能夠動態的控制列表的列&#xff0c;例如&#xff0c;英語老師只想知道自己學…

Windows HD Video Converter Factory PRO-v27.9.0-

Windows HD Video Converter Factory PRO 鏈接&#xff1a;https://pan.xunlei.com/s/VOL9TaiuS7rXbu-1kEDndoceA1?pwd7qch# 支持300多種視頻格式轉換&#xff0c;在保留視頻質量的同時&#xff0c;壓縮率可達80%&#xff0c;轉換速度可達50X速率&#xff01; 支持畫面剪切、片…

C++程序設計語言筆記——抽象機制:構造、清理、拷貝和移動

0 應該將構造函數、賦值操作以及析構函數設計為一組匹配的操作。 在C中&#xff0c;構造函數、賦值操作符和析構函數共同管理對象的資源生命周期。為確保資源安全且一致地處理&#xff0c;需將它們作為一組匹配的操作設計。以下是關鍵要點&#xff1a; 為何需要協同設計&…

##Hive安裝-初始化元數據報錯 *** schemaTool failed ***

報錯&#xff1a; org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version. Underlying cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : Communications link failure 解決方案&#xff1a; 嘗試一&#xff1a;javax.jdo.o…

遠程手機遙控開關原理及應用

遠程手機遙控開關的工作原理主要是通過互聯網傳遞無線信號&#xff0c;控制用電器的一種智能家居產品。 遠程手機遙控開關的基本套件包括&#xff1a;手機APP、網線、家用WIFI中轉無服務器或者是工廠提供的自帶網線端口的中轉服務器、連接用電器的接收器。使用時&#xff0c;手…

Mac java全棧開發環境配置

前言 由于最近手中的windows本子壞了,所以搞了一臺m系列的macbookpro 作為一個開發者 面對新設備最先考慮的應該就是各種sdk、中間件服務、環境變量配置和工具了吧!!! 本文將帶你手把手學習Mac搭建屬于自己的本地開發環境 安裝brew 什么是brew? ?Brew(全稱Homebrew)…

Ubuntu conda虛擬環境不同設備之間遷移

Ubuntu conda環境遷移&#xff08;conda-pack&#xff09; 方法一&#xff1a;壓縮拷貝方法二&#xff1a;conda-pack 在一臺電腦配置好conda虛擬環境后&#xff0c;若在其它電腦需要同樣的環境&#xff0c;可通過如下兩種方式進行遷移。 方法一&#xff1a;壓縮拷貝 找到Ubu…

詳細學習 pandas 和 xlrd:從零開始

詳細學習 pandas 和 xlrd&#xff1a;從零開始 前言 在數據處理和分析中&#xff0c;Excel 文件是最常見的數據格式之一。Python 提供了強大的庫 pandas&#xff0c;可以輕松地處理 Excel 文件中的數據。同時&#xff0c;我們還可以使用 xlrd 來讀取 Excel 文件&#xff0c;尤…

HTMLCSS繪制三角形

1.代碼&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>01triangle</title><s…

vue3-element-admin 前后端本地啟動聯調

一、后端環境準備 1.1、下載地址 gitee 下載地址 1.2、環境要求 JDK 17 1.3、項目啟動 克隆項目 git clone https://gitee.com/youlaiorg/youlai-boot.git數據庫初始化 執行 youlai_boot.sql 腳本完成數據庫創建、表結構和基礎數據的初始化。 修改配置 application-dev.y…

C++中error C2027: 使用了未定義類型 問題部分解決方法

在 C 編程中&#xff0c;遇到錯誤 C2027&#xff1a;“使用了未定義類型”通常意味著在代碼中使用了某種類型&#xff0c;但是編譯器無法識別這個類型的定義。這個錯誤通常有幾個常見的原因&#xff1a; 1. 缺少包含頭文件 如果使用了某個庫中的類型&#xff0c;但是沒有包含…

WinForm模態與非模態窗體

1、模態窗體 1&#xff09;定義&#xff1a; 模態窗體是指當窗體顯示時&#xff0c;用戶必須先關閉該窗體&#xff0c;才能繼續與應用程序的其他部分進行交互。 2&#xff09;特點&#xff1a; 窗體以模態方式顯示時&#xff0c;會阻塞主窗體的操作。用戶必須處理完模態窗體上…

Agisoft Metashape 創建分塊建模

Agisoft Metashape 創建分塊建模 文章目錄 Agisoft Metashape 創建分塊建模前言一、構建分塊模型1.1、設置模型范圍1.2、參數設置二、構建紋理三、導出分塊模型3.1整體導出3.2單獨導出選定的分塊四、編輯分塊模型前言 從 Agisoft Metashape Professional 的 2.1. 版本開始,就…

golang從入門到做牛馬:第二十二篇-Go語言并發:多任務的“協同作戰”

在Go語言中,并發是一種強大的編程范式,允許程序同時執行多個任務。Go通過goroutines和channels提供了一種簡潔且高效的方式來實現并發。此外,Go的調度器(Scheduler)基于GMP模型,能夠高效地管理并發。接下來,讓我們一起深入了解Go語言中的并發機制。 Goroutines:輕量級的…

MinIO的預簽名直傳機制

我們傳統使用MinIo做OSS對象存儲的應用方式往往都是在后端配置與MinIO的連接和文件上傳下載的相關接口&#xff0c;然后我們在前端調用這些接口完成文件的上傳下載機制&#xff0c;但是&#xff0c;當并發量過大&#xff0c;頻繁訪問會對后端的并發往往會對服務器造成極大的壓力…

手把手教你用Docker搭建gitlab

文章目錄 前言一、安裝Docker二、安裝GItlab三、配置Gitlab四、備份五、Docker數據持久化總結 前言 如題所述&#xff0c;手把手帶你搭建gitlab&#xff0c;目標是實現ssh鏈接clone項目&#xff0c;不會我隨你怎么說。 說正題&#xff0c;GitLab 是一個基于 Git 的全面 DevOps…

基于springboot住院管理系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 隨著世界經濟信息化、全球化的到來和電子商務的飛速發展&#xff0c;推動了很多行業的改革。若想達到安全&#xff0c;快捷的目的&#xff0c;就需要擁有信息化的組織和管理模式&#xff0c;建立一套合理、暢通、高效的線上管理系統。當前的住院管理存在管理效率低下&…

JVM常用概念之常量

問題 final修飾的字段就一定是不能重新賦值嗎? 基礎知識 常量變量是使用常量表達式初始化的原始類型或 String 類型的最終變量。變量是否為常量變量可能對類初始化、二進制兼容性和明確賦值有影響。 —Java 語言規范 實驗 用例源碼-重新賦值 import java.lang.reflect.Fie…