前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++20的四个模块新特性应用

C++20的四个模块新特性应用

原创
作者头像
zhqnb
发布2022-04-01 12:13:39
7070
发布2022-04-01 12:13:39
举报
文章被收录于专栏:C++20

C++20的四个模块新特性应用

I.新特性一览

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

II.正文

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

Moudules(模块)

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

一个例子

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

代码语言:c++
复制
import iostream
export moudule test_m
export void test_Func(){
    std:cout<<"Test from C++20\n";
}

在主程序main.cpp中写下

代码语言:c++
复制
import test_m
int main(int argc, char** argv){
	test_Func();
	return 0;
}

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

Ranges(范围库)

ranges中的range概念是一种类似于迭代器的东西。但传统的迭代器并不具有类型安全的特性。

其中我认为很有用的是ranges的相关概念——管道操作符

下面是网络上的示例代码

代码语言:c++
复制
// 使用管道操作符前
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) 
};

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

代码语言:c++
复制
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(概念库)

它减小了对模板类型的限制,在项目构造过程中,我们可以不必考虑用语言特性对模板类作静态限制

我们不妨做一个对比:

在C++20之前,我们可以用如下方式对模板参数进行限制:

type supprot

trait等等

在C++20及之后,有了Concepts这一灵活的限制。我们可以直接使用。

定义一个concept
代码语言:c++
复制
template<typename T>
concept test_Concept = requires(T x){
	x-=1;
}

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

代码语言:c++
复制
/*函数前限制*/
template<typename T> requires test_Concept<T>
void Func(T t);

我们也可以这么写

代码语言:c++
复制
/*函数后限制*/
template<typename T> 
void Func(T t) requires test_Concept<T>;

还有许多限制的方法,此处不再一一列出

PS.标准库也将提供一些concept

Coroutines(协程)

协程是一个可以记住自身状态,可随时挂起和执行的函数。

下面是一段别人写的简单的协程应用,我将在代码注释内讲解协程相关关键字的含义。

代码语言:c++
复制
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,含义是挂起协程以等待其他计算完成

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • C++20的四个模块新特性应用
    • I.新特性一览
      • II.正文
        • Moudules(模块)
        • Ranges(范围库)
        • Concepts(概念库)
        • Coroutines(协程)
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档