首页 > 后端开发 > C++ > 正文

c++怎么实现一个简单的协程生成器(Generator)_C++协程基础与生成器实现

冰火之心
发布: 2025-11-11 08:13:24
原创
265人浏览过
C++20协程通过co_yield、co_return和promise_type实现生成器,支持懒加载整数序列。示例中Generator结合range函数按需产出值,每次next()恢复执行至下一yield,value()获取当前值,体现协程挂起与恢复机制。

c++怎么实现一个简单的协程生成器(generator)_c++协程基础与生成器实现

在C++20中,协程(Coroutines)被正式引入语言标准,使得我们可以实现像生成器(Generator)这样的懒计算序列。一个简单的生成器可以按需产生值,而不是一次性生成所有结果,这在处理大数据流或无限序列时非常有用。

理解C++20协程基本组件

要实现一个生成器,需要了解协程的三个核心部分:

  • co_yield:暂停执行并返回一个值,下次恢复从此处继续。
  • co_return:结束协程,可选返回最终状态。
  • co_await:等待一个异步操作完成(生成器中不一定用到)。

除此之外,还需要定义一个promise_type来控制协程的行为,比如如何处理yield的值、如何获取返回对象等。

实现一个简单的int生成器

下面是一个简化但可用的整数生成器实现,支持通过co_yield逐步返回int值:

立即学习C++免费学习笔记(深入)”;

uBrand Logo生成器
uBrand Logo生成器

uBrand Logo生成器是一款强大的AI智能LOGO设计工具。

uBrand Logo生成器 57
查看详情 uBrand Logo生成器
#include <coroutine>
#include <iostream>

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<promise_type>::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<promise_type> handle;

    explicit Generator(std::coroutine_handle<promise_type> 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协程的核心机制。实际项目中可进一步扩展支持更多类型、异常安全、迭代器接口等。

以上就是c++++怎么实现一个简单的协程生成器(Generator)_C++协程基础与生成器实现的详细内容,更多请关注php中文网其它相关文章!

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号