約束和概念
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 的泛型參數加上上界和下界,從而形成有界泛型參數。