本文章来自腾讯云B站气氛组
。。。
我只是给copy过来了(doge)
C++20部分新特性应用
I.新特性一览
我想这一张图就足以说明大部分的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
等等
在C20及之后,有了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,含义是挂起协程以等待其他计算完成
评论区