首页 » SEO优化 » phpgetimageinfourl技巧_解读C即将迎来的重大年夜更新一C20的四大年夜新特点

phpgetimageinfourl技巧_解读C即将迎来的重大年夜更新一C20的四大年夜新特点

访客 2024-12-13 0

扫一扫用手机浏览

文章目录 [+]

作者:JP Tech等

机器之心编译

phpgetimageinfourl技巧_解读C即将迎来的重大年夜更新一C20的四大年夜新特点

参与:Panda、杜伟

phpgetimageinfourl技巧_解读C即将迎来的重大年夜更新一C20的四大年夜新特点
(图片来自网络侵删)

C++20(C++ 编程措辞标准 2020 版)将是 C++ 措辞一次非常重大的更新,将为这门措辞引入大量新特性。
近日,C++ 开拓者 Rainer Grimm 正通过一系列博客文章先容 C++20 的新特性。
目前这个系列文章已经更新了两篇,本篇是第一篇,紧张先容了 C++20 的 Big Four(四大新特性:观点、范围、协程和模块)以及核心措辞(包括一些新的运算符和指示符)。

C++20 有很多更新,上图展示了 C++20 更新的概况。
下面作者首先先容 了 C++20 的编译器支持情形,然后先容 The Big Four(四大新特性)以及核心措辞方面的新特性。

C++20 的编译器支持

适应新特性的最大略方法是试用它们。
那么接下来我们就面临着这个问题:哪些编译器支持 C++20 的哪些特性?一样平常来说,cppreference.com/compiler_support_能供应在核心措辞和库方面的答案。

大略来说,全新的 GCC、Clang 和 EDG 编译器能供应对核心措辞的最佳支持。
此外,MSVC 和 Apple Clang 编译器也支持许多 C++20 特性。

C++20 核心措辞特色。

库方面的情形类似。
GCC 在库方面的支持最好,接下来是 Clang 和 MSVC 编译器。

C++20 库特色。

上面的截图仅展示了对应表格的前面一部分,可以看出这些编译器的表现并不是非常令人满意。
纵然你利用的是全新的编译器,这些编译器仍旧不支持很多新特性

常日来说,你能找到考试测验这些新特性的方法。
下面是两个示例:

观点:GCC 支持观点的前一个版本;std::jthread:GitHub 上有一个实现草案,来自 Nicolai Josuttis:https://github.com/josuttis/jthread

大略来说,问题没有那么严重。
只须要一些调度修正,很多新特性就能进行考试测验。
如有必要,我会提到如何进行这样的修正。

四大新特性

观点(concept)

利用模板进行通用编程的关键思想是定义能通过各种类型(type)利用的函数和类。
但是,在实例化模板时常常会涌现用错类型的问题,其结果常日是几页难懂的报错信息。

现在观点来了,这个问题可以休矣。
观点让你能为模板编写哀求,而编译器则可以检讨这个哀求。
观点改造了我们思考和编写通用代码的办法。
缘故原由如下:

模板的哀求是接口的一部分;类模板中的函数重载或分外化可以基于观点进行;由于编译器能够比较模板参数的哀求与实际的模板参数,以是能得到更好的报错信息。

但是,这还不是全部。

你可以利用预定义的观点,也可以定义你自己的观点;auto 和观点的用法统一到了一起。
你可以不该用 auto,而是利用观点;如果一个函数声明利用了一个观点,那么它会自动变成一个函数模板。
由此,编写函数模板就变得与编写函数一样大略。

下面的代码片段展示了一个大略观点 Integral 的定义和利用办法:

template<typename T>concept bool Integral(){    return std::is_integral<T>::value;}Integral auto gcd(Integral auto a,                       Integral auto b){    if( b == 0 ) return a;     else return gcd(b, a % b);}

Integral 这个观点须要 std::is_integral<T>::value 中的类型参数 T。
std::is_integral<T>::value 这个函数来自 type-traits 库,它能在 T 为整数检讨编译韶光。
如果 std::is_integral<T>::value 的值为 true,则没有问题。
如果不为 true,则你会收到一个编译韶光报错。
如果你很好奇(你也该当好奇),我的这篇文章先容了 type-traits 库:https://www.modernescpp.com/index.php/tag/type-traits。

gcd 算法是基于欧几里德算法确定最大公约数(greatest common divisor)。
我利用了这个缩写函数模板句法来定义 gcd。
gcd 哀求其参数和返回类型支持观点 Integral。
gcd 是一类对参数和返回值都有哀求的函数模板。
当我删除这个句法糖(syntactic sugar)时,大概你能看到 gcd 的真正实质。

下面这段代码在语义上与 gcd 算法等效:

template<typename T>requires Integral<T>()T gcd(T a, T b){    if( b == 0 ) return a;     else return gcd(b, a % b);}

如果你还没看到 gcd 的真正实质,过几周我还会专门发布一篇先容观点的文章。

范围库(Ranges Library)

范围库是观点的首个客户。
它支持的算法知足以下条件:

可以直接在容器上操作;无需迭代器指定一个范围;可以宽松地评估;可以组合。

大略来说:范围库支持函数模式(functional patterns)。

代码可能比措辞描述更清楚。
下面的函数用竖线符号展示了函数组成:

#include <vector>#include <ranges>#include <iostream>int main(){  std::vector<int> ints{0, 1, 2, 3, 4, 5};  auto even = [](int i){ return 0 == i % 2; };  auto square = [](int i) { return i  i; };  for (int i : ints | std::view::filter(even) |                       std::view::transform(square)) {    std::cout << i << ' ';             // 0 4 16  }}

even 是一个 lambda 函数,其在 i 为偶数时返回;lambda 函数 square 则会将 i 映射为它的平方。
别的的必须从左到右读取的第 i 个函数组成:for (int i : ints | std::view::filter(even) | std::view::transform(square)). 将过滤器 even 运用于 ints 的每个元素,然后将别的的每个元素映射为它们的平方。
如果你熟习函数编程,那么这读起来就像一篇散文诗。

协程(Coroutines)

协程是广义的函数,能在保持状态的同时停息或连续。
协程常日用来编写事宜驱动型运用。
事宜驱动型运用可以是仿照、游戏、做事器、用户接口或算法。
协程也常日被用于协作式多任务(cooperative multitasking)。

我们这里不先容 C++20 的详细协程,而会先容编写协程的框架。
编写协程的框架由 20 多个函数构成,个中一部分须要你去实现,另一部分则可能须要重写。
因此,你可以根据需求调度协程。

下面展示了一个特定协程的用法。
下面的程序利用了一个能产生无限数据流的天生器:

Generator<int> getNext(int start = 0, int step = 1){    auto value = start;    for (int i = 0;; ++i){        co_yield value;            // 1        value += step;    }}int main() {    std::cout << std::endl;    std::cout << "getNext():";    auto gen = getNext();    for (int i = 0; i <= 10; ++i) {        gen.next();               // 2        std::cout << " " << gen.getValue();                      }    std::cout << "\n\n";    std::cout << "getNext(100, -10):";    auto gen2 = getNext(100, -10);    for (int i = 0; i <= 20; ++i) {        gen2.next();             // 3        std::cout << " " << gen2.getValue();    }    std::cout << std::endl;}

必须补充几句。
这段代码只是一个代码段。
函数 getNext 是一个协程,由于它利用了关键字 co_yield。
getNext 有一个无限的循环,其会在 co_yield 之后返回 value。
调用 next()(注释的 第 2、3 行)会连续这个协程,接下来的 getValue 调用会获取这个值。
在 getNext 调用之后,这个协程再一次停息。
其停息会一贯持续到下一次调用 next()。
我的这个示例中有一个很大的未知,即 getNext 函数的返回值 Generator<int>。
这部分内容很繁芜,后面我在写协程的文章中更详细地先容。

利用 Wandbox 在线编译器,我可以向你展示这个程序的输出:

模块(Module)

模块部分大略先容一下就好。
模块承诺能够实现:

更快的编译韶光;宏的隔离;表达代码的逻辑构造;不必再利用头文件(header file);摆脱丑陋的宏方法。

原文链接:https://www.modernescpp.com/index.php/thebigfour

标签:

相关文章

大数据拆解,介绍现代数据驱动的奥秘

随着互联网技术的飞速发展,大数据已成为当今社会的重要资源。大数据拆解,即对海量数据进行深度挖掘和分析,从中提取有价值的信息。本文将...

SEO优化 2024-12-15 阅读0 评论0

大数据挖掘,开启新时代的智慧之门

随着信息技术的飞速发展,大数据已经成为当今时代的重要特征之一。大数据挖掘作为一种重要的数据处理技术,已成为各行各业提升竞争力、创新...

SEO优化 2024-12-15 阅读0 评论0

大数据拷问,介绍数据时代的机遇与挑战

随着信息技术的飞速发展,大数据已成为推动社会进步的重要力量。大数据在为我们带来便利的也引发了一系列拷问:如何确保数据安全、如何防范...

SEO优化 2024-12-15 阅读0 评论0

大数据报纸,引领新闻传播变革的新力量

随着互联网技术的飞速发展,大数据已经渗透到我们生活的方方面面。作为信息传播的重要载体,报纸行业也迎来了前所未有的变革。大数据报纸作...

SEO优化 2024-12-15 阅读0 评论0