Тип обещания в C++
Компилятор строит сопрограмму вокруг вложенного promise_type - объекта, который хранит состояние и связывает кадр с типом результата.
Минимальный набор включает
get_return_object,
initial_suspend,
final_suspend,
unhandled_exception и либо
return_void, либо return_value
под выбранный способ завершения. Для
co_yield добавляют yield_value.
Запишем все эти методы в одном типе и
выведем маркер из тела:
#include <coroutine>
#include <iostream>
struct demo {
struct promise_type {
demo get_return_object() {
return demo{
std::coroutine_handle<promise_type>::from_promise(*this)};
}
std::suspend_always initial_suspend() { return {}; }
std::suspend_always final_suspend() noexcept { return {}; }
void return_void() {}
void unhandled_exception() { std::terminate(); }
};
std::coroutine_handle<promise_type> h;
explicit demo(std::coroutine_handle<promise_type> handle)
: h(handle) {}
~demo() {
if (h) {
h.destroy();
}
}
};
static demo show_promise() {
std::cout << "run\n";
co_return;
}
int main() {
demo job = show_promise();
while (!job.h.done()) {
job.h.resume();
}
return 0;
}
Строка "run" появляется только после
resume, потому что
initial_suspend настроен на
std::suspend_always.
Перечислите в комментарии к своему
promise_type пять обязательных
методов и реализуйте их для сопрограммы
с co_return.