Отдача значения из сопрограммы в 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 из обещания.