co_yield я ещё как-то освоил, интересует возможность илдить что-то с аргументом, полученным через co_await.
иными словами - повторить вот этот питоновый код:
>>> def double_inputs():
... while True:
... x = yield
... yield x * 2
...
>>> gen = double_inputs()
>>> next(gen) # run up to the first yield
>>> gen.send(10) # goes into 'x' variable
20
https://github.com/lewissbaker/cppcoro
видел, но там в async_generator<T> не вполне понятно как что-то слать. показан пример с ожиданием таймера, но это не "принятие аргумента". это потом никак в co_yield не использовать. надо бы что-то вида int i = co_await something; co_yield object(i)
В примере с питона у тебя нет авэйта
там x = yield, это оно ж и есть
Ну, это co_yield
co_yield это на выход из генератора. мне нужен вход
Вход в генерато это вызов функции
вот нужна возможность что-то периодически передавать в один и тот же генератор. через awaitable, я так понял
На сколько я понимаю в такой задаче входом будет другой генератор. Для него нужно будет реализовать "концепт" awaitable (на самом деле такого концепта нет, но мне удобнее это так называть). С ходу я не скажу, может в cppcoro генератор уже реализует awaitable и тогда можно все готовое использовать.
я не против awaitable, знать бы только как из него достать какую-либо передаваемую в генератор переменную
Очень приблизительно так: class Source { struct promise_type { int value; int yield_value() { return value; } ... }; coroutine_handle m_coro; public: void push(int v) { m_coro.promise().value = v; } }; Скорее всего для того чтобы реализовать awaitable понадобится еще continuation хранить в promise. upd: Код принципиально неправильный и сама идея реализовывать здесь корутину не верна.
Хотя я туплю. Кажется здесь сама корутина не нужна. Можно просто awaitable реализовать.
Кажется здесь уже без экзекютера не обойтись. Если я правильно понимаю, такой источник данных должен при suspend'е должен сохранить continuation. В методе push он долен зашедулить исполнение в экзекютере. В простейшем случае думаю можно просто продолжить исполнение на текущем трэде. В общем я попробую набросать рабочий пример.
yield_value разве можно без аргументов? (ну и соответственно co_yield без expression?)
Действительно нельзя. Да и возвращать yield_value() должен awaitable. Сейчас добавлю апдейт, что этот код - бред.
Проблема решилась на stack overflow, спасибо доброму человеку https://gcc.godbolt.org/z/8aMjej
кажется у тебя баг в питонокоде
Да, там none через раз
эх. Не успел. =( Единственное что я бы хранил значение снаружи в generator_input и передавал бы ссылку на него в лямбду при конструировании. Но это мелочи если считать это просто демострационным кодом.
Обсуждают сегодня