侧边栏壁纸
博主头像
梦荟楼的后花园博主等级

干啥啥不行干饭第一名

  • 累计撰写 47 篇文章
  • 累计创建 124 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

C++20部分新特性应用

梦荟楼
2022-04-01 / 0 评论 / 0 点赞 / 1248 阅读 / 4075 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2024-01-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

本文章来自腾讯云B站气氛组。。。我只是给copy过来了(doge)

C++20部分新特性应用

I.新特性一览

image-1648784875295
我想这一张图就足以说明大部分的C++20新特性

II.正文

图中浅蓝色的是本文要讲解的C++20的四个新特性

Moudules(模块)

它彻底改变了C++源码的组织方式,在项目的编写过程中,我们不必再区分.cpp和.h文件

一个例子

我们在test_m.cpp中写下如下代码

import iostream
export moudule test_m
export void test_Func(){
    std:cout<<"Test from C++20\n";
}

在主程序main.cpp中写下

import test_m
int main(int argc, char** argv){
	test_Func();
	return 0;
}

我们可以发现程序仍然可以正常运行,不必再加入pragma once的声明

Ranges(范围库)

ranges中的range概念是一种类似于迭代器的东西。但传统的迭代器并不具有类型安全的特性。
其中我认为很有用的是ranges的相关概念——管道操作符
下面是网络上的示例代码

// 使用管道操作符前
vector data { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
auto result { 
	transform(reverse(drop(transform(filter(data,isOdd),doubleNum),2)),to_string) 
};

不难发现,这段代码的可读性非常差,处理全都叠在了一起。让我们再看看用管道操作符的另外一种写法

vector data { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
auto result { data
   | views::filter([](const auto& value) { return value % 2 == 0; }   
   | views::transform([](const auto& value) { return value * 2.0; }
   | views::drop(2)
   | views::reverse
   | views::transform([](int i) { return to_string(i); }
};

代码的可读性有了很大的提升,数据的处理流程更加清楚。而且使用这种处理方式不会产生中间数组,直接进行惰性计算。

Concepts(概念库)

它减小了对模板类型的限制,在项目构造过程中,我们可以不必考虑用语言特性对模板类作静态限制
我们不妨做一个对比:
在C20之前,我们可以用如下方式对模板参数进行限制:
type supprot
trait
等等
在C
20及之后,有了Concepts这一灵活的限制。我们可以直接使用。

定义一个concept

template<typename T>
concept test_Concept = requires(T x){
	x-=1;
}

在使用时,我们对require限制的位置较为随意

/*函数前限制*/
template<typename T> requires test_Concept<T>
void Func(T t);

我们也可以这么写

/*函数后限制*/
template<typename T> 
void Func(T t) requires test_Concept<T>;

还有许多限制的方法,此处不再一一列出
PS.标准库也将提供一些concept

Coroutines(协程)

协程是一个可以记住自身状态,可随时挂起和执行的函数。
下面是一段别人写的简单的协程应用,我将在代码注释内讲解协程相关关键字的含义。

generator<int> sep(int start)       
{
    while(true) co_yield start++;//co_yield是挂起协程并弹出,这里是弹出start后start自加,然后挂起协程,以后使用
}

generator<int> take(generator<int>& src, int nums) // 只拿前nums个数
{
    if(nums <= 0) co_return;//co_return是从协程中返回
    for(auto e : src) {
        co_yield e;//弹出e
        if(num-- == 0) break;
    }
}

还有一个关键字叫做co_wait,含义是挂起协程以等待其他计算完成

0

评论区