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

Можно ли лямбду хранить в классе (не std::function) ? Как шаблонный

параметр передать к примеру

46 ответов

5 просмотров

Можно

Aleksei-Budyakov Автор вопроса
Ilya Zviagin
Можно

Через шаблонный параметр ?

зависит от ситуации

Aleksei Budyakov
Через шаблонный параметр ?

как вариант template <class Fn> class LambdaHolder { public: LambdaHolder(Fn&& lambda) : lambda(std::forward<Fn>(lambda)) {} template <class... Args> auto Call(Args&&... args) { return lambda(std::forward<Args>(args)...); } private: Fn lambda; }

Ilya Zviagin
Через std function можно ещё

так изначально вопрос был про то, как можно кроме std::function)

Serhii Herashchenko
как вариант template <class Fn> class LambdaHolde...

небольшая придирка: этот конструктор только для rvalue, лучше принимать по значению

Serhii Herashchenko
разве это не универсальная ссылка?

во-первых, термин "универсальная ссылка" придумал Мейерс, в стандарте это forwarding reference. во-вторых, в данном контексте - нет, это rvalue

Aleksei Budyakov
Через шаблонный параметр ?

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

Aleksei-Budyakov Автор вопроса
Ilya Zviagin
Через указатель на функцию можно, если лямбда без ...

Я вот думал внутри класса ее сохранить может как-то можно

Alexander Karaev
во-первых, термин "универсальная ссылка" придумал ...

аа, то есть forwarding reference будет только для шаблонной функции

Aleksei Budyakov
Я вот думал внутри класса ее сохранить может как-т...

Лямбда есть объект неизвестного, уникального класса, создаваемого в момент определения лямбды. Про это надо помнить когда хочешь сохранить. Поскольку класс неизвестен, его можно "захватить" только в шаблонный параметр класса или функции. То есть либо ты пишешь шаблонный класс, либо используешь уже готовый. Для второго и создана std:: function , которую ты не хочет почему-то использовать

Serhii Herashchenko
аа, то есть forwarding reference будет только для ...

Вроде бы наоборот, только в шаблоне эта ссылка будет универсальной

Ilya Zviagin
Вроде бы наоборот, только в шаблоне эта ссылка буд...

ну я про то, что ссылка будет универсальной только в контексте auto&& и template <class... Args> Ret Fn(Args&&... args);

Serhii Herashchenko
void* size_t size работает с 1972

https://foonathan.net/2017/01/function-ref-implementation/

Serhii Herashchenko
void* size_t size работает с 1972

(но это была шутка, если что)

Aleksei-Budyakov Автор вопроса
Ilya Zviagin
Лямбда есть объект неизвестного, уникального класс...

Я ее не хочу использовать т.к она даёт оверхед

Aleksei-Budyakov Автор вопроса
Serhii Herashchenko
как вариант template <class Fn> class LambdaHolde...

Почему по RValue и что тут делает std::forward ?

Aleksei-Budyakov Автор вопроса
Serhii Herashchenko
там дальше было обсуждение этого

Я вроде понял, что так делать не хорошо.

Aleksei-Budyakov Автор вопроса
Aleksei Budyakov
Std::forward

почему не хорошо

Aleksei-Budyakov Автор вопроса
Serhii Herashchenko
почему не хорошо

Это штука позволяет в зависимости от того что передано передавать далее lvalue или rvalue ?

Aleksei-Budyakov Автор вопроса
Ilya Zviagin
ЧЕГО она даёт?

Вызов std::function медленнее лямбды, не ?

Aleksei-Budyakov Автор вопроса
Serhii Herashchenko
да

Так, итого эта штука норм работает для всех передаваемых типов ?

Aleksei Budyakov
Вызов std::function медленнее лямбды, не ?

Я конечно понимаю, ты - кульный хакер, и тебе каждый байтик памяти, каждая лишняя наносекунда дорога... Но всё же: сделай сначала программу работающей, затем уже делай её быстро работающей

Aleksei Budyakov
Вызов std::function медленнее лямбды, не ?

Ну максимум пара лишних переходов по указателю

Aleksei-Budyakov Автор вопроса
Ilya Zviagin
Я конечно понимаю, ты - кульный хакер, и тебе кажд...

Нет, я просто учусь. Хотелось бы сразу писать правильно, если важен performance

Aleksei-Budyakov Автор вопроса
Ilya Zviagin
Но тебе НЕ ВАЖЕН перформанс.

Важен, иначе бы писал на питоне. std::function не инлайняться к примеру, иногда Хип алокейтят кепчер блок лямбды. Короче, вопрос был не о том надо оно мне или нет.

Aleksei Budyakov
Важен, иначе бы писал на питоне. std::function не ...

std::function — это шаблон. он не может не инлайниться. И не всё быстро, что инлайнится. Но видимо тебе лучше другой язык поискать надо, ПОБЫСТРЕЕ. Я понимаю...

Aleksei Budyakov
Важен, иначе бы писал на питоне. std::function не ...

никакие вызовы хранимых функций не инлайнятся

Serhii Herashchenko
никакие вызовы хранимых функций не инлайнятся

В смысле сохранённой ссылки на функцию?

Aleksei Budyakov
Важен, иначе бы писал на питоне. std::function не ...

как-то странно думать о "высоких материях", одновременно задавая вопросы про std::forward.. лямбды, конечно, намного лучше оптимизируются, но это не часто имеет значение

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

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

А как старый хаскел с новым стыковать ? потому как тут работает https://play.haskell.org/saved/C3xpMzcd, а вот тут https://stepik.org/lesson/7602/step/9?unit=1473 нет ошибка C...
Fedor
131
что насчет пагинга? на осдеве непонятно(
Vi Chapmann 🪙
26
Народ, кто шарит в расширенных разделах (EBR/EPR) на дисках с разметками MBR? Везде пишут (в вики рус/англ) в частности + другие источники смотрел, что первый сектор расширенн...
Eugene Krasnikov (ᴊɪɴ x)
1
Вопрос я правильно понимаю что в коде newtype ArrowMap k v = ArrowMap { getArrowMap :: k -> Maybe v } getArrowMap есть функция типа k -> Maybe v, если да, то не понимаю задач...
Fedor
64
что лучше для раста, Clion или IntellJ IDEA?
dbxty
11
Ребят, что лучше для реверса: гидра или ида?
En Vind Av Sorg
26
Делаю велосипед логгер. К сообщению хочу прикрутить некоторую информацию, типа, кем отправлено, какой уровень, и всякое такое. И тут подумалось мне, почему бы не хранить весь...
Serjone
24
Как Вы считаете нормально ли в двадцатых годах 21 века в ВУЗах Российской Федерации обучать студентов работе с TASM? Не слишком ли это "архаично"? (Если оффтоп или флейм для э...
Spiker01
52
А вообще существует редактор (современный), который не позиционирует себя как "легковесный, удобный и расширяемый"?
Andrey Zgarbul
7
Комрады, хотел уточнить. Проперть в OnDestroy юнита-хозяина по-прежнему доступна? И еще уточнение: finalization юнита наступает раньше или позже OnDestroy?
Ed Doc
48
Карта сайта