Войти
ПрограммированиеСтатьиОбщее

Сопрограммы на С++, начальный уровень (8 стр)

Автор:

6. Как реализовать Awaiter для разных типов

+ код

Корутины:

TaskA    t0 = [] () -> TaskA
{
    co_return;
}();
        
TaskB    t1 = [] (TaskA &t0) -> TaskB
{
    co_await t0;
    co_return;
}( t0 );

В предыдущих примерах использовался вариант void  await_suspend (std::coroutine_handle<>).
Но ничего не мешает сделать перегрузку метода под конкретный тип промиса:

struct TaskA { struct promise_type{ int    _data; };};
struct TaskB { struct promise_type{ string _data; };};

struct Awaiter
{
    bool  await_ready () const  { return false; }
    void  await_resume ()       {}

    void  await_suspend (std::coroutine_handle< TaskA::promise_type > h) {
        h.promise()._data = 0;
    }
        
    void  await_suspend (std::coroutine_handle< TaskB::promise_type > h) {
        h.promise()._data = "123";
    }
};

Awaiter  operator co_await (const TaskA &)  { return {}; }
Страницы: 13 4 5 6 7 8

#C++

7 ноября 2022 (Обновление: 11 мар 2024)

Комментарии [58]