您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    解读C++行将迎来的严重更新:C++20的四大新特性(2)
    时间:2020-03-06 21:22 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    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{012345}; 

     

      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 = 0int 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(); 

     

    (责任编辑:admin)