约束和概念
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 的泛型参数加上上界和下界,从而形成有界泛型参数。