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

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

43 ответов

3 просмотра

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

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

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

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

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

Кстати, а я вот тут подумал. Допустим, у нас имеется цикл который выполняет огромное количество итераций, но мы хотим, чтобы какие-то действия исполнилось только один раз. В Я...
The Bird of Hermes
23
Доброй ночи. Вопрос знатокам. Имеется некая таблица, результат которой выведен в DBGrid на форме. И есть форма, с помощью которой можно как добавить запись, так и отредактиров...
Евгений
28
а всё почему? потому что ассемблер в отличии от яву порождает множество пагубных привычек, среди которых например можно отметить использование глобальных переменных для всего ...
Mixail Frolov
35
анрей С какой целью зашёл?
КТ315
42
я часов 15 назад начал пытаться написать хоть что-то напоминающее ос и у меня есть проблема, которую я пытаюсь решить последние часов 5: есть крч 2 исходника с минимальным код...
Al1to
17
Кто нибудь из участников чата пишет на ассемблере под GNU/Linux?
Spiker01
24
Всем привет ребят! Мб кто-то сталкивался? adminСomponents .get("searchСomponents", use: searchComponents) .openAPI( summary: ...
Admin Adminov
2
Насколько моя реализация Exercise 1 плохая? data MessageType = Info | Warning | Error Int deriving (Show, Eq) type TimeStamp = Int data LogMessage = LogMessage ...
= ?
10
Кстати вопрос. Проанализировав свои проекты я понял, что в наиболее ценных из них Асм использовался для организации real-time процессов (внутри DOS). А какие есть способы сего...
Alexander Morozov
18
Я не очень много работал с потоками, тут возник вопрос - если будет одновременный доступ к памяти из двух разных потоков, это само по себе приведет к ошибке?
The Bird of Hermes
25
Карта сайта