能否简化C++协程示例?C++23是否有内置默认promise_type?
关于C协程示例简化与C23内置promise_type的解答
一、可进一步简化的纯协程示例
要展示交错执行与主动调度,核心需保留协程挂起、外部持有句柄、主动resume三个要素。以下是极致简化的实现,去掉冗余封装,直接暴露核心逻辑:
#include <coroutine> #include <iostream> // 极简协程返回类型,嵌套promise_type struct SimpleTask { struct promise_type { // 返回当前任务实例 SimpleTask get_return_object() { return {}; } // 协程启动时不挂起 std::suspend_never initial_suspend() { return {}; } // 协程结束时挂起,避免自动销毁句柄 std::suspend_always final_suspend() noexcept { return {}; } // 无返回值处理 void return_void() {} // 异常处理(极简版直接终止) void unhandled_exception() { std::terminate(); } // 自定义awaiter:强制挂起,保存协程句柄供外部调度 struct SuspendForSchedule { bool await_ready() const noexcept { return false; } void await_suspend(std::coroutine_handle<> h) { stored_handle = h; } void await_resume() noexcept {} static inline std::coroutine_handle<> stored_handle; }; }; }; // 示例协程1 SimpleTask coroA() { std::cout << "CoroA: 执行第一步\n"; co_await SimpleTask::promise_type::SuspendForSchedule{}; std::cout << "CoroA: 执行第二步\n"; } // 示例协程2 SimpleTask coroB() { std::cout << "CoroB: 执行第一步\n"; co_await SimpleTask::promise_type::SuspendForSchedule{}; std::cout << "CoroB: 执行第二步\n"; } int main() { // 启动协程,获取挂起后的句柄 coroA(); auto handleA = SimpleTask::promise_type::SuspendForSchedule::stored_handle; coroB(); auto handleB = SimpleTask::promise_type::SuspendForSchedule::stored_handle; // 主动调度,实现交错执行 handleA.resume(); // 继续执行coroA第二步 handleB.resume(); // 继续执行coroB第二步 // 销毁协程句柄 handleA.destroy(); handleB.destroy(); return 0; }
简化要点:
- 去掉额外的任务句柄封装,直接用static成员存储协程句柄
- 仅保留协程运行必需的
promise_type成员函数 - 用最简的自定义awaiter实现主动挂起与调度入口
执行后输出:
CoroA: 执行第一步 CoroB: 执行第一步 CoroA: 执行第二步 CoroB: 执行第二步
清晰展示了两个协程的交错执行逻辑。
二、C++23中是否存在内置默认promise_type?
没有。C++23标准并未提供通用的内置promise_type。所有用户自定义的协程返回类型,必须通过以下两种方式关联promise_type:
- 在返回类型中嵌套定义
promise_type结构体(如上述示例) - 特化
std::coroutine_traits模板,为返回类型指定对应的promise_type
标准库提供的std::generator等组件,是封装了各自promise_type的协程适配器,但不属于“内置默认promise_type”范畴。纯手写协程时,必须自行定义promise_type来控制协程行为。
内容的提问来源于stack exchange,提问作者Gonen I
相关产品推荐
相关产品推荐

