zwvista

导航

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

posted on 2020-03-17 09:38  zwvista  阅读(2472)  评论(0编辑  收藏  举报