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

这篇具有很好参考价值的文章主要介绍了掌握C++20的革命性特性:Concepts。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

C++20 的新特性

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

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

注意:编写 Concepts 时,请确保它们模拟语义,而不仅仅是语法。

Concepts 的语法

定义 Concepts 的通用语法如下:

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

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

Concept 表达式的语法如下:

concept-name<argument-list>

Concept 表达式评估为真或假。如果评估为真,则称给定的模板参数模拟了该 Concept。

Constraints Expression

常量表达式

可直接用作 Concept 定义约束的布尔常量表达式必须精确地计算为布尔值,不进行任何类型转换。例如:

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

Requires 表达式

Requires 表达式的语法如下:

requires (parameter-list) { requirements; }

参数列表是可选的。每个要求必须以分号结束。有四种类型的要求:简单要求、类型要求、复合要求和嵌套要求。

简单要求

简单要求是任意不以 requires 开头的表达式语句。例如,以下 Concept 定义规定了某种类型 T 必须支持后缀和前缀 ++ 操作符:

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

类型要求验证某种类型是否有效。例如,以下 Concept 要求某种类型 T 具有 value_type 成员:

template <typename T>
concept C = requires {
    typename T::value_type;
};
复合要求

复合要求用于验证某事物不抛出异常,以及/或验证某个方法返回特定类型。例如,以下 Concept 验证给定类型具有标记为 noexcept 的 swap() 方法:

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

Requires 表达式可以包含嵌套要求。例如,这里是一个要求类型大小为 4 字节并支持前缀和后缀增量和减量操作的 Concept:

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

Requires 表达式可以有多个参数,并且可以由一系列要求组成。例如,以下 Concept 要求类型 T 的实例是可比较的:

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

组合 Concept 表达式

使用逻辑运算符组合

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

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

预定义的标准 Concepts

标准库中的 Concepts

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

  • 核心语言 Conceptssame_asderived_fromconvertible_tointegralfloating_pointcopy_constructible 等。
  • 比较 Conceptsequality_comparabletotally_ordered 等。
  • 对象 Conceptsmovablecopyable 等。
  • 可调用 Conceptsinvocablepredicate 等。

此外,<iterator> 头文件定义了与迭代器相关的 Concepts,如 random_access_iteratorforward_iterator 等,还定义了算法要求,如 mergeablesortablepermutable 等。

C++20 范围库还提供了一些标准 Concepts。第17章《理解迭代器和范围库》详细讨论了迭代器和范围,而第20章更深入地探讨了标准库提供的算法。

使用标准 Concepts

如果这些标准 Concepts 满足您的需求,您可以直接使用它们,无需自己实现。例如,以下 Concept 要求类型 T 是从类 Foo 派生的:

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

以下 Concept 要求类型 T 可以转换为 bool

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

这些标准 Concepts 也可以组合成更具体的 Concepts。例如,以下 Concept 要求类型 T 既是默认构造的也是可拷贝构造的:

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

注意:编写完整且正确的 Concepts 并不总是容易的。如果可能,尝试使用现有的标准 Concepts 或它们的组合来约束您的类型。文章来源地址https://www.toymoban.com/news/detail-807761.html

到了这里,关于掌握C++20的革命性特性:Concepts的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ChatGPT-4 Alpha:OpenAI的革命性升级

    近日,OpenAI公司发布了备受瞩目的GPT-4 Alpha版本,这是一次革命性的升级。以下将为您详细介绍这一重大突破,并解释为何它引起了广泛关注。 GPT-4 Alpha是OpenAI公司最新推出的人工智能语言模型,它基于GPT-4.0架构开发,拥有更强大的处理能力和更出色的表现。该模型经过大规

    2024年02月20日
    浏览(34)
  • Transformer模型简介:一种革命性的深度学习模型

    Transformer模型是一种革命性的深度学习模型,最初用于自然语言处理任务,如机器翻译和语言建模。与传统的序列模型相比,如循环神经网络(RNN)和卷积神经网络(CNN),Transformer模型采用一种全新的方式来处理序列数据,即通过注意力机制来学习序列中的关系。 在传统的序列模

    2024年02月15日
    浏览(44)
  • DDC技术:AIGC网络的革命性解决方案

    2023年,人工智能生成内容(AIGC)技术将蓬勃发展,其中ChatGPT作为一个典型案例,在文本生成、代码开发和诗歌创作等多个领域引起行业变革。DDC技术对改变网络格局具有创新和突破性意义,很大程度上提升了效率和连接性。本文将介绍这一AIGC网络的新一代革命性解决方案—

    2024年02月19日
    浏览(41)
  • 加速软件开发和交付的革命性方法-DevOps

    “ 随着信息技术的快速发展,现代软件开发和交付已经经历了巨大的变革。DevOps(Development和Operations的结合)已经成为这一变革的关键推动力,让开发团队和运维团队之间的界限变得模糊,以加速软件的开发、测试和部署过程。本文将介绍DevOps的核心概念、原则和优势,以及

    2024年02月06日
    浏览(40)
  • 机器学习与人工智能:一场革命性的变革

    1956年8月,在美国汉诺斯小镇宁静的达特茅斯学院中,约翰·麦卡锡(John McCarthy)、马文·闵斯基(MarvinMinsky,人工智能与认知学专家)、克劳德·香农(Claude Shannon,信息论的创始人)、艾伦·纽厄尔(AllenNewell,计算机科学家)、赫伯特·西蒙(Herbert Simon,诺贝尔经济学奖得

    2024年02月04日
    浏览(42)
  • 【Docker】联合探讨Docker:容器化技术的革命性应用

    前言 Docker 是一个 开源的应用容器引擎 ,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux或Windows 操作系统的机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。 📕作者简介: 热爱跑步的恒川 ,致力于

    2024年02月08日
    浏览(32)
  • 无人机巡检技术革命性变革光伏电站运维管理

    在中国广袤的大地上,光伏电站如雨后春笋般崛起,晶体硅组件板在阳光下熠熠生辉,为人们带来了源源不断的绿色能源。然而,随着光伏产业的迅猛发展,电站运维管理面临着前所未有的挑战。而无人机巡检技术的引入,为光伏电站的运维管理带来了革命性的变革。 相比传

    2024年04月14日
    浏览(42)
  • Nuxt.js:下一代Web开发框架的革命性力量

    随着互联网的飞速发展,Web开发已经成为了当今技术领域最热门的话题之一。在这个竞争激烈的市场中,开发者们不断地寻求新的技术和工具来提高开发效率、降低维护成本。而在这个过程中,Nuxt.js作为一款革命性的Web开发框架,正逐渐成为开发者们的宠儿。本文将详细介绍

    2024年02月05日
    浏览(42)
  • 如何将区块链与大数据结合,为行业带来革命性变革

    区块链技术和大数据技术都是21世纪的热门话题之一,它们各自具有独特的优势,如果将它们结合起来,将会为各行业带来革命性变革。区块链技术可以提供一个安全、透明、去中心化的数据共享平台,而大数据技术则可以提供海量、多样化的数据源,这两者的结合将有望解

    2024年04月09日
    浏览(45)
  • 视频生成可以无限长?谷歌VideoPoet大模型上线,网友:革命性技术

    蒙娜丽莎打哈欠,小鸡学会举铁……谷歌VideoPoet大模型表现很亮眼。 2023 年底,科技公司都在冲击生成式 AI 的最后一个关卡 —— 视频生成。 本周二,谷歌提出的视频生成大模型上线,立刻获得了人们的关注。这款名为 VideoPoet 的大语言模型,被人们认为是革命性的 zero-sho

    2024年02月02日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包