C++20嘗鮮:概念(Concepts)


約束和概念

C++20引進了概念(Concepts)這一新特性。
概念是指給一組要求(Requirements)所起的名字。概念是一種具名謂詞。
使用這些要求和概念可以給函數和類模板的參數加上約束(Constraints)。

引入概念的目的

  • 約束成為模板界面的一部分
  • 基於概念的重載成為可能
  • 模板的出錯信息更加友好
  • 沒有約束的 auto 和有約束的概念得到統一

約束的種類

約束有三種類型

  • 合取(conjunction)
    約束的合取:使用 && 運算符
  • 析取(disjunction)
    約束的析取:使用 || 運算符
  • 原子約束(atomic constraint)

Requires 子句

Requires 子句由關鍵字 requires 后加上常量表達式構成,用於指定約束。

Requires 表達式

Requires 表達式是 bool 類型的右值表達式,用於表達約束。其形式為

requires ( 形參列表(可選) ) { 要求序列 }

要求序列中的要求有以下四種形式:

  • 簡單要求(simple requirement)
    簡單要求是任意表達式語句。
  • 類型要求(type requirement)
    類型要求是關鍵字 typename 加一個類型名。
  • 復合要求(compound requirement)
    { 表達式 } noexcept(可選) 返回類型要求(可選) ;
    返回類型要求 - -> 類型約束
  • 嵌套要求(nested requirement)
    requires 約束表達式 ;

C#中的泛型約束

約束 說明 版本
where T : struct T必須是值類型 2.0
where T : class T必須是引用類型 2.0
where T : [base class] T必須繼承自[base class]類型 2.0
where T : [interface] T必須實現[interface]類型 2.0
where T : new() T必須帶有一個沒有參數的構造器 2.0
where T : unmanaged T必須是非托管類型 7.3
where T : Enum T必須是枚舉類型 7.3
where T : Delegate T必須是委托類型 7.3

Java中的泛型約束

使用 extends 以及 super 關鍵字可以給 Java 的泛型參數加上上界和下界,從而形成有界泛型參數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM