co_yield временно отдает значение наружу и приостанавливает сопрограмму. Для него в promise_type объявляют yield_value.">
Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗cpSpCrYd 576 of 696 menu
◀ ▶

Отдача значения из сопрограммы в C++

Оператор co_yield временно отдает значение наружу и приостанавливает сопрограмму.

Для него в promise_type объявляют yield_value, а начало и конец держат на std::suspend_always. Запишем сопрограмму с одной отдачей и выведем число после первого resume:

#include <coroutine> #include <iostream> struct step { struct promise_type { int current = 0; step get_return_object() { return step{ std::coroutine_handle<promise_type>::from_promise(*this)}; } std::suspend_always initial_suspend() { return {}; } std::suspend_always final_suspend() noexcept { return {}; } std::suspend_always yield_value(int value) { current = value; return {}; } void return_void() {} void unhandled_exception() { std::terminate(); } }; std::coroutine_handle<promise_type> h; explicit step(std::coroutine_handle<promise_type> handle) : h(handle) {} ~step() { if (h) { h.destroy(); } } step(const step&) = delete; step& operator=(const step&) = delete; }; static step pick() { co_yield 7; } int main() { step job = pick(); job.h.resume(); std::cout << job.h.promise().current << "\n"; job.h.resume(); return 0; }

Второй resume доводит сопрограмму до конечной приостановки, после чего дескриптор уничтожает деструктор объекта step.

Объявите сопрограмму, которая один раз отдает 3 через co_yield. После resume выведите поле current из обещания.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить