Как использовать C ++ Coroutine с QT?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как использовать C ++ Coroutine с QT?

Сообщение Anonymous »

Я пытаюсь использовать Coroutines с Qt.
Вот минимальный (я думаю) пример, чтобы воспроизвести мою проблему
, в основном, код Bellow принят из примера Cppreference здесь:
https://en.cppreference.com/w/cppretine ... e.htmlенно PrettyPrint-Override ">#include
#include
#include
#include

template
struct task
{
struct promise_type
{
auto get_return_object()
{
return task(std::coroutine_handle::from_promise(*this));
}
std::suspend_always initial_suspend() { return {}; }
struct final_awaiter
{
bool await_ready() noexcept { return false; }
void await_resume() noexcept {}
std::coroutine_handle
await_suspend(std::coroutine_handle h) noexcept
{
if (auto previous = h.promise().previous; previous)
return previous;
else
return std::noop_coroutine();
}
};
final_awaiter final_suspend() noexcept { return {}; }
void unhandled_exception() { throw; }
void return_value(T value) { result = std::move(value); }

T result;
std::coroutine_handle previous;
};

task(std::coroutine_handle h) : coro(h) {}
task(task&& t) = delete;
~task() { coro.destroy(); }

struct awaiter
{
bool await_ready() { return false; }
T await_resume() { return std::move(coro.promise().result); }
auto await_suspend(std::coroutine_handle h)
{
coro.promise().previous = h;
return coro;
}
std::coroutine_handle coro;
};
awaiter operator co_await() { return awaiter{coro}; }
T operator()()
{
coro.resume();
return std::move(coro.promise().result);
}

private:
std::coroutine_handle coro;
};

class qt_timeout {
int m_delay = 0;
public:
qt_timeout(int delay) noexcept : m_delay{delay} {}
auto await_ready() const noexcept { return false; }
auto await_suspend(std::coroutine_handle h) noexcept
{ QTimer::singleShot(m_delay, qApp, [h] { h.resume(); }); }
auto await_resume() noexcept {}
};

auto timeout(int ms) -> task
{
co_await qt_timeout(ms);
co_return ms;
}

auto main(int argc, char **argv) -> int
{
QCoreApplication app{argc, argv};
QMetaObject::invokeMethod(&app, [] {
auto t = timeout(1000);
const auto r = t();
qDebug()

Подробнее здесь: https://stackoverflow.com/questions/797 ... ne-with-qt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»