C++23’s Coroutine Generator样例
Generator是C++23的一个新特性,它是一个协程,可以生成一个序列。Generator是一个函数,宖以co_yield
语句,每次调用co_yield
语句时,函数会暂停执行,并返回一个值。当再次调用函数时,函数会从上次暂停的地方继续执行。
其他语言中也有类似的特性,比如Python的yield
关键字,JavaScript的yield
关键字,C#的yield
关键字等。
C++23的Generator目前支持的编译器较少,GCC最新的trunk分支已经支持。
这里给出一个Fibonacci数列的例子:
#include <generator>
#include <iostream>
#include <ranges>
#include <utility>
std::generator<int> fib() {
int i = 0;
int j = 1;
while (true) {
co_yield i = std::exchange(j, i + j);
}
}
int main() {
auto sep = "";
// print first 10 elements
for (auto i : fib() | std::views::take(10)) {
std::cout << sep << i;
sep = ", ";
}
return 0;
}
运行结果:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55