170 похожих чатов

Модули сделают менее полезной`std::function`?

43 ответов

34 просмотра

Мне даже интересно, а как это связано?

Anatoliy-Tomilov [Russia] Автор вопроса
Daniil Goncharov
Мне даже интересно, а как это связано?

так, что реализация всегда будет видна (ну ладно, не "всегда" а почти всегда) и использовать void *, что прячется внутри std::function, не нужно будет. Можно будет писать template<typename F> void g(F && f) { ... f(); } вместо void g(std::function<void ()> f); + реализация где-то в другом месте.

Anatoliy Tomilov [Russia]
так, что реализация всегда будет видна (ну ладно, ...

Ну std::function еще нужен если вдруг тебе понадобится хранить функтор где-то со стиранием типов

Anatoliy-Tomilov [Russia] Автор вопроса
Anatoliy-Tomilov [Russia] Автор вопроса
Oleksandr
Эээ, а вариант тут причем? :)

вот вы мыслите в старой парадигме. В std::variant можно перечислить все типы (функциональных объектов и указателей на функцию). Они ж все видны

Anatoliy Tomilov [Russia]
вот вы мыслите в старой парадигме. В std::variant ...

Да, и как это связано с модулями и функторами?

Anatoliy Tomilov [Russia]
вот вы мыслите в старой парадигме. В std::variant ...

Классический пример где используется std::funtion - callback. Его не заменить.

magras
Классический пример где используется std::funtion ...

Его как раз можно заменить на шаблонный аргумент. Если вынести реализацию функции в хедер.

Anatoliy-Tomilov [Russia] Автор вопроса
magras
Классический пример где используется std::funtion ...

я не про границы м/у so и dll — это как раз законный маргинальный случай, где std::function и прочие void * вполне себе законны

Anatoliy Tomilov [Russia]
я не про границы м/у so и dll — это как раз законн...

Да даже в своём коде - далеко не всегда хочется ломать границы модулей, только чтобы перечислить все возможные типы функторов

Constantine Drozdov
а как в нём лямбду перечислить, простите?

Ну, в принципе по идее можно указать ее через decltype, но зачем?

Oleksandr
Его как раз можно заменить на шаблонный аргумент. ...

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

Anatoliy-Tomilov [Russia] Автор вопроса
Constantine Drozdov
а как в нём лямбду перечислить, простите?

грубо говоря вот так auto f() { auto l = [] {}; return std::variant<decltype(l)>{l}; }

magras
Ну нет же. Колбеки обычно требуют type erasure, по...

Можно действовать от закрытого мира, тогда TypeErasure равносилен перечислению всех возможностей (их конечное число)

magras
Ну нет же. Колбеки обычно требуют type erasure, по...

В случае очереди предполагается хранение, и вот тут уже без стирания типов не обойтись

Oleksandr
Колбеки бывают очень разные

Да, пожалуй я слишком обобщил. Но грубо говоря boost.asio требует std::function или чего-то похожего.

Anatoliy-Tomilov [Russia] Автор вопроса
Constantine Drozdov
не, мне надо f.set_callback([this] () { blah; blah...

если реализация колбэка видна, то он просто шаблонный

Anatoliy-Tomilov [Russia] Автор вопроса
Anatoliy-Tomilov [Russia] Автор вопроса
Constantine Drozdov
button::on_enable_change

я сейчас не про границы между модулями и, условно говоря, *.o-файлами

Anatoliy Tomilov [Russia]
если реализация колбэка видна, то он просто шаблон...

А если его надо хранить в некой очереди как в примере с boost.asio выше?

Anatoliy Tomilov [Russia]
std::queue<std::variant<F1, F2, F3>>

> можно действовать от закрытого мира, тогда TypeErasure равносилен перечислению всех возможностей (их конечное число) < но не нужно

Anatoliy Tomilov [Russia]
std::queue<std::variant<F1, F2, F3>>

Тогда эта очередь сможет хранить только три типа колбеков. Зачем они тогда вообще нужны? Может заменить на enum class Action { F1, F2, F3 }?

Anatoliy-Tomilov [Russia] Автор вопроса
Oleksandr
Тогда эта очередь сможет хранить только три типа к...

повторяю. В собственном коде есть конечное число типов и все они видимые. На границах с чужим кодом void * понадобится. Я не спорю с этим.

Anatoliy Tomilov [Russia]
повторяю. В собственном коде есть конечное число т...

Как должна выглядеть простейшая реализация однопоточного экзекютера через вариант? class executor { std::queue<std::function<void()> m_queue; public: void spawn(std::funtion<void()> f) { m_queue.push(f); } void run() { while (!m_queue.empty()) { m_queue.front()(); m_queue.pop(); } } };

magras
Как должна выглядеть простейшая реализация однопот...

для начала замените std::function<void()> на шаблонный параметр :)

magras
Я сказал простейшего. =)

не вижу усложнений от автозамены и парочки корректур)

Anatoliy Tomilov [Russia]
повторяю. В собственном коде есть конечное число т...

Дело не в границах кода, дело в том, что ваша очередь поддерживает всего три типа функторов

Constantine Drozdov
Ну добавьте четвертый в список

Эм, ну, ээ, ну в принципе можно.

Constantine Drozdov
для начала замените std::function<void()> на шабло...

В общем случае от variant либо type erasure не избавиться...

Dmitriy [Отпуск]
В общем случае от variant либо type erasure не изб...

Ну Анатолий верно замечает, что для закрытой программы variant и TypeErasure в позиции шаблонного параметра просто одинаковые

Constantine Drozdov
Ну Анатолий верно замечает, что для закрытой прогр...

Это замечательно с теоретической точки зрения. Но на практике как мою задачу решать?

magras
Это замечательно с теоретической точки зрения. Но ...

Задачи пока не вижу. Есть какое-то решение задачи, представленное каким-то кодом

Constantine Drozdov
Задачи пока не вижу. Есть какое-то решение задачи,...

Задача написать простейший однопоточный экзекютор.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Ребят в СИ можно реализовать ООП?
Николай
33
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
2
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта