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

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

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

46 ответов

17 просмотров

Можно

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.. лямбды, конечно, намного лучше оптимизируются, но это не часто имеет значение

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта