返回资讯中心
外部精选
软件工程
#开发者实时流

C++ 协程技巧:用辅助类简化 co_await 多参数传递

来源标题:How can I simplify using a helper class to pass multiple parameters to co_await?

文章介绍用辅助类封装 co_await 的多参数传递,避免调用方手动构造组合参数。作者给出 Widget 示例:私有 with_priority 结构体接收 widget 与 priority,内部转发 await_ready、await_suspend、await_resume,调用方无需再为 mega-parameter 命名。

Hacker News 最新ibobev2026/11/15 · 今天5 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

上次我们弄清楚了如何把多个参数合并成一个“超级参数”传给 co_await。但每次都要给这个超级参数起名字,实在烦人。今天有 widget_with_priority,明天又冒出个 gadget_with_timeout,后天再来个 doodad_with_priority_and_timeout——天哪,简直失控了。

与其让调用方去给这个超级参数起名字,不如创建一个辅助方法来生成它。

struct Widget ⟦ ... 其他内容 ... ⟧ private: bool inner_await_ready() const { return ⟦ ... ⟧; } bool inner_await_suspend(std::coroutine_handle<> handle, int priority) return internal_start(handle, priority); auto inner_await_resume() const { return ⟦ ... ⟧; } struct with_priority with_priority(Widget const& widget, int priority) : m_widget(widget), m_priority(priority) {} bool await_ready() const { return m_widget.inner_await_ready(); } auto await_suspend(std::coroutine_handle<> handle) return m_widget.inner_await_suspend(handle, m_priority); auto await_ready() { return m_widget.await_ready(); Widget const& m_widget; int m_priority; }; public: with_priority start(int priority = 0) { return with_priority(*this, priority); };

现在调用方可以这样写:

co_await widget.start(priority);

为了方便起见,我给 start() 方法加了一个默认优先级,所以你也可以直接写:

co_await widget.start();

你甚至可以决定恢复直接 await widget 的用法,让它表示“以默认优先级启动”。

struct Widget ⟦ ... 其他内容 ... ⟧ ⟦ ... 和之前一样 ... ⟧ public: with_priority start(int priority = 0) { return with_priority(*this, priority); // 或者你可以直接 await Widget,这会以默认优先级启动它。 auto await_ready() const { return inner_await_ready(); } auto await_suspend(std::coroutine_handle<> handle) return internal_start(handle, 0); auto await_resume() const { internal_await_resume(); } };

到这一步,你可以把内部的 awaitable 方法改回原来的名字,从而简化这个类。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →