C++20协程通过co_yield、co_return和promise_type实现生成器,支持懒加载整数序列。示例中Generator结合range函数按需产出值,每次next()恢复执行至下一yield,value()获取当前值,体现协程挂起与恢复机制。

在C++20中,协程(Coroutines)被正式引入语言标准,使得我们可以实现像生成器(Generator)这样的懒计算序列。一个简单的生成器可以按需产生值,而不是一次性生成所有结果,这在处理大数据流或无限序列时非常有用。
理解C++20协程基本组件
要实现一个生成器,需要了解协程的三个核心部分:
- co_yield:暂停执行并返回一个值,下次恢复从此处继续。
- co_return:结束协程,可选返回最终状态。
- co_await:等待一个异步操作完成(生成器中不一定用到)。
除此之外,还需要定义一个promise_type来控制协程的行为,比如如何处理yield的值、如何获取返回对象等。
实现一个简单的int生成器
下面是一个简化但可用的整数生成器实现,支持通过co_yield逐步返回int值:
立即学习“C++免费学习笔记(深入)”;
1、数据调用该功能使界面与程序分离实施变得更加容易,美工无需任何编程基础即可完成数据调用操作。2、交互设计该功能可以方便的为栏目提供个性化性息功能及交互功能,为产品栏目添加产品颜色尺寸等属性或简单的留言和订单功能无需另外开发模块。3、静态生成触发式静态生成。4、友好URL设置网页路径变得更加友好5、多语言设计1)UTF8国际编码; 2)理论上可以承担一个任意多语言的网站版本。6、缓存机制减轻服务器
#include#include struct Generator { struct promise_type { int current_value; std::suspend_always initial_suspend() { return {}; } std::suspend_always final_suspend() noexcept { return {}; } Generator get_return_object() { return Generator{ std::coroutine_handle ::from_promise(*this) }; } void return_void() {} std::suspend_always yield_value(int value) { current_value = value; return {}; } void unhandled_exception() { std::terminate(); } }; std::coroutine_handle handle; explicit Generator(std::coroutine_handle h) : handle(h) {} ~Generator() { if (handle) handle.destroy(); } // 禁止拷贝 Generator(const Generator&) = delete; Generator& operator=(const Generator&) = delete; // 支持移动 Generator(Generator&& other) noexcept : handle(other.handle) { other.handle = nullptr; } Generator& operator=(Generator&& other) noexcept { if (this != &other) { if (handle) handle.destroy(); handle = other.handle; other.handle = nullptr; } return *this; } bool next() { if (!handle || handle.done()) return false; handle.resume(); return !handle.done(); } int value() const { return handle.promise().current_value; } };
使用生成器构造数值序列
现在可以写一个函数,利用co_yield逐步返回数值:
Generator range(int start, int stop, int step = 1) {
for (int i = start; i < stop; i += step) {
co_yield i;
}
}
然后在main函数中遍历这个生成器:
int main() {
auto gen = range(1, 6);
while (gen.next()) {
std::cout << gen.value() << " ";
}
// 输出: 1 2 3 4 5
return 0;
}
每次调用next()都会恢复协程执行到下一个co_yield,value()获取当前产出的值。
关键点说明
- std::suspend_always 表示协程在开始和每次yield后都挂起,由外部控制恢复。
- get_return_object() 在协程创建初期被调用,用来返回用户使用的Generator实例。
- yield_value(int) 保存当前值,并挂起协程。
- 必须手动管理协程句柄的生命周期,避免资源泄漏。
基本上就这些。这个生成器虽然简单,但展示了C++20协程的核心机制。实际项目中可进一步扩展支持更多类型、异常安全、迭代器接口等。










