Size: a a a

2020 October 20

O

Oleksandr in pro.cxx
CuBeR116
Хммм, если это уже более продвинутый уровень, может, я не правильно понял задачу.

Задача такова:
1. Создать класс Stack, который будет реализовывать принцип работы структуры данных стек. Размер стека не должен быть ограничен (используйте динамический массив).

2. Реализовать для любого типа данных на выбор (int, float, double, string). Должны быть как минимум методы pop(), чтобы достать из стека верхний элемент, и push(), чтобы добавить новый элемент.

Я так понял, что, нужно создать массив исходя того типа, который пришел, и этим типом заполнять его
"на выбор" я понимаю как "по своему усмотрению". Я бы сделал IntStack без всяких шаблонов или type erasure и остановился бы на этом
источник

VK

Valentin Kornienko in pro.cxx
Вопрос по корутинам:
https://pastebin.com/RKS5Nktm
В функции initDisplay() хочу выызывать последовательность команд для инициализации дисплея из массива предопределенных команд. Как можно приостановить выполнение всго Metas:tupleApply чтобы он не вызывал лямбду новую до момента завершения сопрограммы с передачей данных?

Meta::TupleApply это фактически std::apply:
template<typename Callable, typename Tuple, std::size_t... Is >
constexpr auto tupleApplyImpl( Callable&& _toCall, const Tuple& _tuple, std::index_sequence<Is...> )
{
   return (_toCall( std::get<Is>( _tuple ) ), ...);
}
template<typename Callable, typename ... ArgsList >
constexpr auto tupleApply( Callable&& _toCall , const std::tuple<ArgsList...>& _tuple )
{
   return tupleApplyImpl( std::forward<Callable>( _toCall ), _tuple, std::index_sequence_for<ArgsList...>{} );
}
источник

VK

Valentin Kornienko in pro.cxx
Т.е. новый вызов sendCommand не должен происходить до завершения предыдущего вызова
источник

m

magras in pro.cxx
Valentin Kornienko
Т.е. новый вызов sendCommand не должен происходить до завершения предыдущего вызова
Я правильно понял, что цель - саспендить корутину на время _commandDescriptor.commandDelay между синхронными вызовами sendCommand?
источник

VK

Valentin Kornienko in pro.cxx
magras
Я правильно понял, что цель - саспендить корутину на время _commandDescriptor.commandDelay между синхронными вызовами sendCommand?
Цель- suspend корутины делать покане пройдет sendCommandассинхронный
источник

VK

Valentin Kornienko in pro.cxx
delay как раз синхронный тут сейчас(пока что, потом на таймер переделаю с корутиной)
источник

VK

Valentin Kornienko in pro.cxx
magras
Я правильно понял, что цель - саспендить корутину на время _commandDescriptor.commandDelay между синхронными вызовами sendCommand?
Т.е.
sendCommand()
.....suspending...
sendCommand()
источник

VK

Valentin Kornienko in pro.cxx
Но, сейчас получается, что происходит вызов корутины, ее приостановка и вызывается снова лямбда, которая в Meta::tupleApply аргументом
источник

m

magras in pro.cxx
Valentin Kornienko
delay как раз синхронный тут сейчас(пока что, потом на таймер переделаю с корутиной)
Если sendCommand() будет принимать колбэк и вызывать его по завершению операции (условно спустя commandDelay), то на сколько я понимаю достаточно в коллбэке делать resume текущей корутине.
источник

VK

Valentin Kornienko in pro.cxx
magras
Если sendCommand() будет принимать колбэк и вызывать его по завершению операции (условно спустя commandDelay), то на сколько я понимаю достаточно в коллбэке делать resume текущей корутине.
Это верно. Вопрос в том, как не дать дальше вызываться остальным sendCommand
источник

VK

Valentin Kornienko in pro.cxx
Т.к. шина занята может быть предыдущей транзакцией
источник

m

magras in pro.cxx
Valentin Kornienko
Это верно. Вопрос в том, как не дать дальше вызываться остальным sendCommand
А как они могут быть вызваны если корутина в саспенде?
источник

VK

Valentin Kornienko in pro.cxx
magras
А как они могут быть вызваны если корутина в саспенде?
Meta::tupleApply(
принимает лямбду, которая является корутиной, если я правильно понимаю
источник

VK

Valentin Kornienko in pro.cxx
Meta::tupleApply(
           [this](const auto& _commandDescriptor) -> void
           {
               co_await sendCommand(_commandDescriptor.command);

               if( _commandDescriptor.commandDelay != 0 )
                   Delay::waitFor(150);
           }
           ,   CommandsArray
       );
источник

VK

Valentin Kornienko in pro.cxx
Т.е.  приостановка будет только для лямбды, но не для top-level функции которая эту лямбду вызывала
источник

VK

Valentin Kornienko in pro.cxx
И соответственно далее будут проходить вызовы этой лямбды
источник

m

magras in pro.cxx
А, извиняюсь, не правильно понял изначальный вопрос.
источник

w

whoami in pro.cxx
Всем, привет !
Кто-нибудь сталкивался в Boost.Asio с высоким потреблением CPU при асинхронной записи (async_write) ?
Если да, то как с этим бороться ?
источник

m

magras in pro.cxx
Valentin Kornienko
Т.е.  приостановка будет только для лямбды, но не для top-level функции которая эту лямбду вызывала
Если грубо, кажется в этом случае нужно внешнюю функцию тоже делать корутиной и добиваться чтобы после раскрытия меташаблонной магии код развернулся в простую последовательность:
void initDisplay() {
 co_await sendCommand(c0);
 co_await sendCommand(c1);
 ...
}


Если нужно могу попробовать набросать пример.
источник

АК

Александр Караев... in pro.cxx
Вопрос по концептам.
Допустим, есть
template <class T> concept foo = ...;

Я его использую как
template <foo T>
void f(T& value);

Теперь я хочу, чтобы f принимала forwarding reference на T

Я могу написать
template <class T> requires foo<std::remove_cvref_t<T>>
void f(T&& value)

но это некрасиво. Как можно запихнуть эту конструкцию в <..>? В идеале, нужна композиция концептов, чтобы можно было шаблонизировать концепты концептами..  типа:
template <unref<foo> T>

Какие есть варианты решения?
источник