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.
相关产品推荐
相关产品推荐

