You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++20项目中使用std::generator生成范围视图?

在C++20中使用类似std::generator的方案

C20标准库本身并未提供std::generator,但可以通过以下几种方式在C20项目中实现等价的协程生成器功能:

1. 手动实现轻量版generator

基于C++20的协程特性,可自行编写极简的generator模板,核心是实现协程的promise_type和迭代器逻辑。示例代码如下:

#include <coroutine>
#include <iterator>
#include <optional>

template<typename T>
struct generator {
    struct promise_type {
        std::optional<T> 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)};
        }
        std::suspend_always yield_value(T val) {
            value = std::move(val);
            return {};
        }
        void return_void() {}
        void unhandled_exception() { std::terminate(); }
    };

    struct iterator {
        std::coroutine_handle<promise_type> coro;
        bool done = false;

        iterator& operator++() {
            coro.resume();
            done = !coro.promise().value.has_value();
            return *this;
        }

        T operator*() const { return *coro.promise().value; }
        bool operator==(std::default_sentinel_t) const { return done; }
    };

    std::coroutine_handle<promise_type> coro;

    generator(std::coroutine_handle<promise_type> h) : coro(h) {}
    ~generator() { if (coro) coro.destroy(); }

    iterator begin() {
        coro.resume();
        return {coro, !coro.promise().value.has_value()};
    }
    std::default_sentinel_t end() { return {}; }
};

// 使用示例
generator<int> count_up_to(int n) {
    for (int i = 1; i <= n; ++i) {
        co_yield i;
    }
}

#include <iostream>
int main() {
    for (int num : count_up_to(5)) {
        std::cout << num << ' ';
    }
    return 0;
}

该实现仅支持基础值类型生成,未处理复杂异常和生命周期细节,但足以覆盖多数简单场景。

2. 采用第三方兼容库

不少成熟C库已基于C20协程实现了与std::generator接口对齐的生成器:

  • Boost.Coroutine2:提供生成器组件,接口虽与标准std::generator略有差异,但核心功能一致,兼容C++20。
  • cppcoro:专注于协程的库,其generator类型行为几乎与C++23的std::generator完全匹配,只需将库源码引入项目即可使用。

这类库通常会处理异常安全、移动语义、const迭代器等边界情况,适合生产环境。

3. 编译器扩展提前支持

部分编译器(如GCC 13+)可通过编译选项开启对C23std::generator的提前支持,例如使用-std=c++23或-std=c++2b编译参数。但如果项目必须严格遵循C20标准,该方式不适用。


内容的提问来源于stack exchange,提问作者Benjamin Buch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:33:28