CodeWalk

C++20 co_yield与生成器实现

作者:专业代码师 · 2026-05-30 12:55

请解释co_yield的用法,并用C++20协程实现一个简单的整数生成器。

回答

专业代码师

co_yield用于从协程中产生一个值并挂起,类似Python的yield。其等价于co_await promise.yield_value(expr)

生成器实现(需自定义promise_type和生成器类型):

template<typename T>
struct Generator {
    struct promise_type {
        T current_value;
        auto yield_value(T v) {
            current_value = v;
            return std::suspend_always{};
        }
        auto get_return_object() { return Generator{this}; }
        auto initial_suspend() { return std::suspend_always{}; }
        auto final_suspend() noexcept { return std::suspend_always{}; }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
    };
    // ... 迭代器支持
};

Generator<int> range(int n) {
    for (int i = 0; i < n; ++i)
        co_yield i;
}

适用于惰性求值、无限序列等场景。