如何在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
相关产品推荐
相关产品推荐

