Size: a a a

2020 October 02

M

Mind in pro.cxx
Anatoly Tomilov
я не про границы м/у so и dll — это как раз законный маргинальный случай, где std::function и прочие void * вполне себе законны
Да даже в своём коде - далеко не всегда хочется ломать границы модулей, только чтобы перечислить все возможные типы функторов
источник

O

Oleksandr in pro.cxx
Constantine Drozdov
а как в нём лямбду перечислить, простите?
Ну, в принципе по идее можно указать ее через decltype, но зачем?
источник

m

magras in pro.cxx
Oleksandr
Его как раз можно заменить на шаблонный аргумент. Если вынести реализацию функции в хедер.
Ну нет же. Колбеки обычно требуют type erasure, потому что все обработчики кладутся в очередь или что-нибудь в этом роде.
источник

O

Oleksandr in pro.cxx
magras
Ну нет же. Колбеки обычно требуют type erasure, потому что все обработчики кладутся в очередь или что-нибудь в этом роде.
Колбеки бывают очень разные
источник

AT

Anatoly Tomilov in pro.cxx
Constantine Drozdov
а как в нём лямбду перечислить, простите?
грубо говоря вот так auto f() { auto l = [] {}; return std::variant<decltype(l)>{l}; }
источник

CD

Constantine Drozdov in pro.cxx
magras
Ну нет же. Колбеки обычно требуют type erasure, потому что все обработчики кладутся в очередь или что-нибудь в этом роде.
Можно действовать от закрытого мира, тогда TypeErasure равносилен перечислению всех возможностей (их конечное число)
источник

O

Oleksandr in pro.cxx
magras
Ну нет же. Колбеки обычно требуют type erasure, потому что все обработчики кладутся в очередь или что-нибудь в этом роде.
В случае очереди предполагается хранение, и вот тут уже без стирания типов не обойтись
источник

CD

Constantine Drozdov in pro.cxx
Anatoly Tomilov
грубо говоря вот так auto f() { auto l = [] {}; return std::variant<decltype(l)>{l}; }
не, мне надо f.set_callback([this] () { blah; blah; })
источник

CD

Constantine Drozdov in pro.cxx
мне тип этой лямбды пихать в определение f?
источник

m

magras in pro.cxx
Oleksandr
Колбеки бывают очень разные
Да, пожалуй я слишком обобщил. Но грубо говоря boost.asio требует std::function или чего-то похожего.
источник

AT

Anatoly Tomilov in pro.cxx
Constantine Drozdov
не, мне надо f.set_callback([this] () { blah; blah; })
если реализация колбэка видна, то он просто шаблонный
источник

AT

Anatoly Tomilov in pro.cxx
Anatoly Tomilov
если реализация колбэка видна, то он просто шаблонный
как в том примере, с которого начал вопрос
источник

CD

Constantine Drozdov in pro.cxx
Anatoly Tomilov
если реализация колбэка видна, то он просто шаблонный
button::on_enable_change
источник

AT

Anatoly Tomilov in pro.cxx
Constantine Drozdov
button::on_enable_change
я сейчас не про границы между модулями и, условно говоря, *.o-файлами
источник

CD

Constantine Drozdov in pro.cxx
Anatoly Tomilov
я сейчас не про границы между модулями и, условно говоря, *.o-файлами
а без них там variant нет
источник

AT

Anatoly Tomilov in pro.cxx
я про код, который целиком из модулей
источник

O

Oleksandr in pro.cxx
Anatoly Tomilov
если реализация колбэка видна, то он просто шаблонный
А если его надо хранить в некой очереди как в примере с boost.asio выше?
источник

AT

Anatoly Tomilov in pro.cxx
Oleksandr
А если его надо хранить в некой очереди как в примере с boost.asio выше?
std::queue<std::variant<F1, F2, F3>>
источник

CD

Constantine Drozdov in pro.cxx
Anatoly Tomilov
std::queue<std::variant<F1, F2, F3>>
> можно действовать от закрытого мира, тогда TypeErasure равносилен перечислению всех возможностей (их конечное число) <
но не нужно
источник

AT

Anatoly Tomilov in pro.cxx
я про принципиальную возможность (кому-то нужно)
источник