当前位置:首页 > 科技  > 软件

掌握C++20的革命性特性:Concepts

来源: 责编: 时间:2024-01-22 08:44:22 171观看
导读C++20 的新特性C++20 引入了 Concepts,这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词,用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编译器错

C++20 的新特性

C++20 引入了 Concepts,这是一种用于限制类和函数模板的模板类型和非类型参数的命名要求。Concepts 是作为编译时评估的谓词,用于验证传递给模板的模板参数。Concepts 的主要目的是使模板相关的编译器错误更易于人类阅读。A7U28资讯网——每日最新资讯28at.com

我们都遇到过这样的情况:当为类或函数模板提供错误的参数时,编译器会输出数百行错误信息。要从这些编译器错误中找到根本原因并不总是容易的。Concepts 允许编译器在某些类型约束不满足时输出更易读的错误消息。因此,为了获得有意义的语义错误,建议编写模拟语义要求的 Concepts。避免仅针对语法方面而没有任何语义意义的 Concepts 验证,例如,仅检查类型是否支持 operator+ 的 Concept。这样的 Concept 只会检查语法,而不是语义。例如 std::string 支持 operator+,但显然,它与整数的 operator+ 有完全不同的含义。另一方面,如 sortable(可排序)和 swappable(可交换)等 Concepts 是模拟一些语义意义的好例子。A7U28资讯网——每日最新资讯28at.com

注意:编写 Concepts 时,请确保它们模拟语义,而不仅仅是语法。A7U28资讯网——每日最新资讯28at.com


A7U28资讯网——每日最新资讯28at.com

A7U28资讯网——每日最新资讯28at.com

A7U28资讯网——每日最新资讯28at.com

Concepts 的语法

定义 Concepts 的通用语法如下:A7U28资讯网——每日最新资讯28at.com

template <parameter-list> concept concept-name = constraints-expression;

它以熟悉的 template<> 规范开始,但与类和函数模板不同,Concepts 永远不会被实例化。接下来,使用一个新关键字 concept,后跟 Concept 的名称。你可以使用任何你想要的名称。constraints-expression 可以是任何常量表达式,即任何可以在编译时评估的表达式。约束表达式必须产生布尔值。约束永远不会在运行时评估。约束表达式将在下一节中详细讨论。A7U28资讯网——每日最新资讯28at.com

Concept 表达式的语法如下:A7U28资讯网——每日最新资讯28at.com

concept-name<argument-list>

Concept 表达式评估为真或假。如果评估为真,则称给定的模板参数模拟了该 Concept。A7U28资讯网——每日最新资讯28at.com

Constraints Expression

1.常量表达式

可直接用作 Concept 定义约束的布尔常量表达式必须精确地计算为布尔值,不进行任何类型转换。例如:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept C = sizeof(T) == 4;

2.Requires 表达式

Requires 表达式的语法如下:A7U28资讯网——每日最新资讯28at.com

requires (parameter-list) { requirements; }

参数列表是可选的。每个要求必须以分号结束。有四种类型的要求:简单要求、类型要求、复合要求和嵌套要求。A7U28资讯网——每日最新资讯28at.com

(1) 简单要求A7U28资讯网——每日最新资讯28at.com

简单要求是任意不以 requires 开头的表达式语句。例如,以下 Concept 定义规定了某种类型 T 必须支持后缀和前缀 ++ 操作符:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept Incrementable = requires(T x) {    x++;    ++x;};

(2) 类型要求A7U28资讯网——每日最新资讯28at.com

类型要求验证某种类型是否有效。例如,以下 Concept 要求某种类型 T 具有 value_type 成员:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept C = requires {    typename T::value_type;};

(3) 复合要求A7U28资讯网——每日最新资讯28at.com

复合要求用于验证某事物不抛出异常,以及/或验证某个方法返回特定类型。例如,以下 Concept 验证给定类型具有标记为 noexcept 的 swap() 方法:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept C = requires (T x, T y) {    { x.swap(y) } noexcept;};

(4) 嵌套要求A7U28资讯网——每日最新资讯28at.com

Requires 表达式可以包含嵌套要求。例如,这里是一个要求类型大小为 4 字节并支持前缀和后缀增量和减量操作的 Concept:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept C = requires (T t) {    requires sizeof(t) == 4;    ++t;    --t;    t++;    t--;};

Requires 表达式可以有多个参数,并且可以由一系列要求组成。例如,以下 Concept 要求类型 T 的实例是可比较的:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept Comparable = requires(const T a, const T b) {    { a == b } -> convertible_to<bool>;    { a < b } -> convertible_to<bool>;    // ... 对其他比较操作符的类似要求 ...};

组合 Concept 表达式

使用逻辑运算符组合:A7U28资讯网——每日最新资讯28at.com

现有的 Concept 表达式可以通过使用逻辑运算符“与”(&&)和“或”(||)来组合。例如,假设您有一个类似于 Incrementable 的 Decrementable Concept;以下示例展示了一个要求类型同时具备增量和减量能力的 Concept:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept IncrementableAndDecrementable = Incrementable<T> && Decrementable<T>;

预定义的标准 Concepts

(1) 标准库中的 ConceptsA7U28资讯网——每日最新资讯28at.com

标准库定义了一系列预定义的 Concepts,分为多个类别。以下列表给出了每个类别中的一些示例 Concepts,所有这些都在 <concepts> 头文件和 std 命名空间中定义:A7U28资讯网——每日最新资讯28at.com

  • 核心语言 Concepts:same_as、derived_from、convertible_to、integral、floating_point、copy_constructible 等。
  • 比较 Concepts:equality_comparable、totally_ordered 等。
  • 对象 Concepts:movable、copyable 等。
  • 可调用 Concepts:invocable、predicate 等。

此外,<iterator> 头文件定义了与迭代器相关的 Concepts,如 random_access_iterator、forward_iterator 等,还定义了算法要求,如 mergeable、sortable、permutable 等。A7U28资讯网——每日最新资讯28at.com

C++20 范围库还提供了一些标准 Concepts。第17章《理解迭代器和范围库》详细讨论了迭代器和范围,而第20章更深入地探讨了标准库提供的算法。A7U28资讯网——每日最新资讯28at.com

(2) 使用标准 ConceptsA7U28资讯网——每日最新资讯28at.com

如果这些标准 Concepts 满足您的需求,您可以直接使用它们,无需自己实现。例如,以下 Concept 要求类型 T 是从类 Foo 派生的:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept IsDerivedFromFoo = derived_from<T, Foo>;

以下 Concept 要求类型 T 可以转换为 bool:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept IsConvertibleToBool = convertible_to<T, bool>;

这些标准 Concepts 也可以组合成更具体的 Concepts。例如,以下 Concept 要求类型 T 既是默认构造的也是可拷贝构造的:A7U28资讯网——每日最新资讯28at.com

template <typename T>concept DefaultAndCopyConstructible = default_initializable<T> && copy_constructible<T>;

注意:编写完整且正确的 Concepts 并不总是容易的。如果可能,尝试使用现有的标准 Concepts 或它们的组合来约束您的类型。A7U28资讯网——每日最新资讯28at.com

A7U28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-65882-0.html掌握C++20的革命性特性:Concepts

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: C++中产生死锁的原因深度解析

下一篇: 科技一周大事(1 月 15 日-21 日):宁德时代、比亚迪推动力电池降本;三星 Galaxy S24 系列手机发布;国产 C919 大飞机已拿下 1200 多架订单

标签:
  • 热门焦点
  • 天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    天猫精灵Sound Pro体验:智能音箱没有音质?来听听我的

    这几年除了手机作为智能生活终端最主要的核心之外,第二个可以成为中心点的产品是什么?——是智能音箱。 手机在执行命令的时候有两种操作方式,手和智能语音助手,而智能音箱只
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、&ldquo;Ringdoll戒之人形&rdquo;淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 阿里大调整

    阿里大调整

    来源:产品刘有媒体报道称,近期淘宝天猫集团启动了近年来最大的人力制度改革,涉及员工绩效、层级体系等多个核心事项,目前已形成一个初步的&ldquo;征求意见版&rdquo;:1、取消P序列
  • 微博大门常打开,迎接海外画师漂洋东渡

    微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    iQOO Neo8系列或定档5月23日:首发天玑9200+ 安卓跑分王者

    去年10月,iQOO推出了iQOO Neo7系列机型,不仅搭载了天玑9000+,而且是同价位唯一一款天玑9000+直屏旗舰,一经上市便受到了用户的广泛关注。在时隔半年后,
Top