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

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

43 ответов

2 просмотра

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

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
Задачи пока не вижу. Есть какое-то решение задачи,...

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

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

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

коллеги, добрый вечер! А никто не знает как модальная форма может себя закрыть? Ну допустим модальная форма определила, что смысла ей работать нет и хочет вернуть modalResult...
Михаил
83
А если изначально бот работал так : есть сайт онлайн школы. У каждого ученика свой кабинет. Где он авторизуется по своим данным. И уже в кабинете, на самом сайте делает оплату...
Денис 💡 Фрилансер
13
А что ты вообще делаешь ?
Yesgoter
13
На работе пишем распределенное приложение, у которого сотни, если не тысячи настроек. Конфиги написаны на xml, расположены на разных хостах и должны быть согласованы друг с др...
Aleksandr Druzhinin
5
Всем привет 🙂 Какая-то непонятная проблема у меня с видео, раньше такого не было. Загружаю видео с гугл диска именно в видео mp4 и меняю ссылку как положено вот она: https://d...
Ксюша|Верстка на Тильде|Дизайн 🦥
6
средствами IBX как-то можно выполнить запрос insert ... returning?
Igor
31
Добрый день Хочу начать обучение языку, не являюсь представителем it, буду благодарна за помощь, совсем пока не понимаю ничего) Подскажите, пожалуйста, где можно начать первы...
Sara Lala
18
что это и почему оно? executor.start_polling(bot, skip_updates=True, on_startup=on_startup, File "/usr/local/lib/python3.10/dist-packages/aiogram/utils/executor.py", line 4...
𐌍𐌄 ᕓ𐌄𐌓𐌌Ꝋ𐌓𐌄
2
Hi there everyone Is there anyone who have not started hamster bot yet? I need only one, I'll be glad if you do this for me DM if you haven't yet
Mehrshad
53
Подскажите, почему в правом коде с1 дополняется до 8байт, а не до 4?
Sergey
9
Карта сайта