Size: a a a

2021 March 10

CD

Constantine Drozdov in pro.cxx
очень похожий на constexpr for :)
источник

KO

Konstantin Osipov in pro.cxx
Big - это узел сети,  foo - реализация роутера.
источник

KO

Konstantin Osipov in pro.cxx
да, это удобно, спасибо большое
источник

АК

Александр Караев... in pro.cxx
Constantine Drozdov

void bar(Big & big) {
   (void)big;
}

template <typename... Args>
void foo(Args&&... args) {
   ((void)bar(args), ...);
}

как бы всегда есть такой вариант
Если bar одноразовая, то лучше уж сразу лямбдой
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
да, это удобно, спасибо большое
ну подобное есть со времен 11, только там использовалась инициализация массива
int dummy[] = { ((void)bar(args), 0)... };
источник

KO

Konstantin Osipov in pro.cxx
да, фактически мне надо просто уже динамическую карту маршрутов заполнить, я это сделаю в bar, потом уже буду использовать карту.
источник

KO

Konstantin Osipov in pro.cxx
спасибо!
источник

CD

Constantine Drozdov in pro.cxx
как товарищ верно замечает, можно в лямбду запихать, да
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
спасибо!
главное не забывайте (void), а то прилетит перегруженная запятая :)))))
источник

DP

Denis Paukaev in pro.cxx
можно, даже сразу с IIFE, правда выглядит своеобразно)

template <typename... Args>
void foo(Args&&... args) {
   int i{};

   (..., static_cast<void>([&i](const auto&){
       ++i;
   }(args)));
}
источник

KO

Konstantin Osipov in pro.cxx
Constantine Drozdov
главное не забывайте (void), а то прилетит перегруженная запятая :)))))
вот тут я не понял совсем, дайте плиз почитать о чём речь
источник

CD

Constantine Drozdov in pro.cxx
Konstantin Osipov
вот тут я не понял совсем, дайте плиз почитать о чём речь
порядок выполнения определён только для неперегруженной запятой, поэтому запись
(bar(args), ...)

немного неточна
источник

CD

Constantine Drozdov in pro.cxx
если bar вернёт что-то с перегруженной запятой, всё немедленно поломается
источник

KO

Konstantin Osipov in pro.cxx
понятно, bar вернёт void
источник
2021 March 11

AU

Abu Umar in pro.cxx
Konstantin Osipov
а итерация по parameter pack только рекурсией или через fold expressions? было бы круто если бы какой-нибуь constexpr for добавили для этого
Можно самому запилить constexpr for, даже реализация где-то валяется для c++17
источник

CD

Constantine Drozdov in pro.cxx
Abu Umar
Можно самому запилить constexpr for, даже реализация где-то валяется для c++17
В boost.hana? :)
источник

AU

Abu Umar in pro.cxx
Constantine Drozdov
В boost.hana? :)
Без всяких бустов)
источник

AU

Abu Umar in pro.cxx
Constantine Drozdov
В boost.hana? :)
источник

YS

Yaroslav Syrytsia in pro.cxx
Привет! А подскажите сишнику, про эти ваши Base/Derived классы и pure virtual method called. Вот есть у меня базовый класс, пусть будет Base, в котом есть virtual void event_handler(Event &ev) = 0. И есть другой класс, пусть будет Derived, который собственно и содержит реализацию этого метода. Что хочу - позвать из Base класса этот метод, но иногда оно падает с ошибкой как выше.
Я подозреваю это случается потому, что Derived класс не успел выполнить свой конструктор, а Base класс уже позвал его метод (т.к. там еще и std::thread, да). И получается то самое "никогда не вызывайте виртуальные методы из конструктора/деструктора"
Вопрос: как бы это все правильно разрулить ? Может, добавить какой-то atomic флаг который сказал бы, что инициализация прошла, или я вообще не прав тут ? :)
источник

П

Пашечка in pro.cxx
Yaroslav Syrytsia
Привет! А подскажите сишнику, про эти ваши Base/Derived классы и pure virtual method called. Вот есть у меня базовый класс, пусть будет Base, в котом есть virtual void event_handler(Event &ev) = 0. И есть другой класс, пусть будет Derived, который собственно и содержит реализацию этого метода. Что хочу - позвать из Base класса этот метод, но иногда оно падает с ошибкой как выше.
Я подозреваю это случается потому, что Derived класс не успел выполнить свой конструктор, а Base класс уже позвал его метод (т.к. там еще и std::thread, да). И получается то самое "никогда не вызывайте виртуальные методы из конструктора/деструктора"
Вопрос: как бы это все правильно разрулить ? Может, добавить какой-то atomic флаг который сказал бы, что инициализация прошла, или я вообще не прав тут ? :)
Ну, как вариант вынести инициализацию и старт тредов из конструктора в метод Initialize.
источник