Прием отданного значения в C++
Метод yield_value принимает значение
из co_yield и обычно кладет его
в поле обещания для внешнего кода.
После resume на точке отдачи поле
уже заполнено, и его можно вывести, не
заглядывая внутрь тела. Запишем одну отдачу
и прочитаем current из обещания:
#include <coroutine>
#include <iostream>
struct hold {
struct promise_type {
int current = 0;
hold get_return_object() {
return hold{
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 hold(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~hold() {
if (h) {
h.destroy();
}
}
};
static hold once() {
co_yield 11;
}
int main() {
hold job = once();
job.h.resume();
std::cout << job.h.promise().current << "\n";
while (!job.h.done()) {
job.h.resume();
}
return 0;
}
Число попадает в current внутри
yield_value еще до того, как
управление вернется в main.
Отдайте через co_yield число
6, сохраните его в поле обещания
и выведите после resume.