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

C++20含co_yield的协程函数,返回类型用什么替代IEnumerable<T>?

C++20协程:co_yield场景的STL内置返回类型问题

C#中的迭代器实现

在C#中,我们可以通过yield return快速实现迭代器:

IEnumerable<int> evenUpTo(int max)
{
    for (int i = 0; i < max; i += 2)
    {
        yield return i;
    }
}

foreach(int e in evenUpTo(11))
{
    Console.WriteLine(e);
}

编译器会自动生成满足IEnumerable<int>接口的类,无需手动实现迭代器逻辑。

C++20协程的对应场景问题

C++20已支持协程,类似的代码结构如下,但返回类型???需要确定:

#include <print>
#include <coroutine>

??? evenUpTo(int max) {
    for (int i = 0; i < max; i += 2) {
        co_yield i;
    }
}

int main() {
    for (auto e : evenUpTo(11)) {
        std::print("{0}\n", e);
    }
}

要求使用STL内置类型,而非自行编写Generator<T>模板,请问返回类型应填写什么?

结论

C20标准库没有内置适配这种co_yield迭代场景的协程返回类型。如果想要开箱即用的类似IEnumerable<T>的协程返回类型,需要升级到C23——C++23标准库新增了<generator>头和std::generator<T>类型,此时可以将返回类型写为std::generator<int>,同时需要包含<generator>头文件。

如果限定在C++20环境下,标准STL无法满足需求,必须自行实现符合协程规范的返回类型(包含promise_type嵌套类型,并实现必要的迭代器支持),或者依赖第三方库提供的generator实现。

内容的提问来源于stack exchange,提问作者Thomas W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:52:04