C++: Можно ли передать указатель объекта сопрограммы другой функции внутри самой сопрограммы?

Если моя фраза была непонятной, вот код.

struct token {};

struct resumable {
    struct promise_type {
        auto get_return_object() {
            return coroutine_handle<promise_type>::from_promise(*this);
        }
        suspend_never initial_suspend() { return {}; }
        suspend_always final_suspend() { return {}; }

        auto await_transform(token)
        {
            struct awaiter {
                awaiter(promise_type& p) : m_promise(p) {}
                bool await_ready() { return false; }
                void await_suspend(coroutine_handle<>) {}
                int await_resume() {
                    int _result = 5;
                    return _result;
                }
                promise_type& m_promise;
            };
            return awaiter(*this);
        }
    };

    bool resume() {
        if (!m_handle.done()) {
            m_handle.resume();
        }
        return !m_handle.done();
    }

    resumable(coroutine_handle<promise_type> h) : m_handle(h) {}

private:
    coroutine_handle<promise_type> m_handle;
};

void someAsyncKernelApi(void* callbackContext)
{
    // When async work is done, enqueues callbackContext into the completion queue.
}

token WrappedAsyncKernelApi(void* callbackContext)
{
    someAsyncKernelApi(callbackContext);
    return token{};
}

resumable coro()
{
    int _async_result = co_await WrappedAsyncKernelApi(/* Is it possible to pass address of this own 
                                                          spawned coroutine to get called later on? 
                                                          Same address the pointer "r_ptr" at main 
                                                          is pointing to*/);
}

int main()
{
    resumable* r_ptr = new auto(coro());
}

Несколько решений, о которых я могу думать прямо сейчас, - это либо начальная приостановка, когда сопрограмма порождается, и сохранение указателя в произвольной структуре и переход из этой сохраненной структуры, либо ожидание возобновляемого указателя при первом ожидании. Но я чувствую, что есть более чистый способ сделать это... Есть ли какой-нибудь?

0 ответов

Другие вопросы по тегам