параметр передать к примеру
Можно
Через шаблонный параметр ?
зависит от ситуации
как вариант 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; }
Через std function можно ещё
так изначально вопрос был про то, как можно кроме std::function)
небольшая придирка: этот конструктор только для rvalue, лучше принимать по значению
разве это не универсальная ссылка?
во-первых, термин "универсальная ссылка" придумал Мейерс, в стандарте это forwarding reference. во-вторых, в данном контексте - нет, это rvalue
Через указатель на функцию можно, если лямбда без захвата, но отдельно надо будет решать проблему с сохранением самой лямбды. Если лямбда, например, глобальная или в другом классе сохранена, то это уже не проблема.
Я вот думал внутри класса ее сохранить может как-то можно
аа, то есть forwarding reference будет только для шаблонной функции
Лямбда есть объект неизвестного, уникального класса, создаваемого в момент определения лямбды. Про это надо помнить когда хочешь сохранить. Поскольку класс неизвестен, его можно "захватить" только в шаблонный параметр класса или функции. То есть либо ты пишешь шаблонный класс, либо используешь уже готовый. Для второго и создана std:: function , которую ты не хочет почему-то использовать
void* size_t size работает с 1972
Вроде бы наоборот, только в шаблоне эта ссылка будет универсальной
ну я про то, что ссылка будет универсальной только в контексте auto&& и template <class... Args> Ret Fn(Args&&... args);
https://foonathan.net/2017/01/function-ref-implementation/
(но это была шутка, если что)
Я ее не хочу использовать т.к она даёт оверхед
Почему по RValue и что тут делает std::forward ?
там дальше было обсуждение этого
Я вроде понял, что так делать не хорошо.
Std::forward
почему не хорошо
Это штука позволяет в зависимости от того что передано передавать далее lvalue или rvalue ?
Вызов std::function медленнее лямбды, не ?
Так, итого эта штука норм работает для всех передаваемых типов ?
не, только для forwarding reference
Я конечно понимаю, ты - кульный хакер, и тебе каждый байтик памяти, каждая лишняя наносекунда дорога... Но всё же: сделай сначала программу работающей, затем уже делай её быстро работающей
Ну максимум пара лишних переходов по указателю
Нет, я просто учусь. Хотелось бы сразу писать правильно, если важен performance
Но тебе НЕ ВАЖЕН перформанс.
Важен, иначе бы писал на питоне. std::function не инлайняться к примеру, иногда Хип алокейтят кепчер блок лямбды. Короче, вопрос был не о том надо оно мне или нет.
std::function — это шаблон. он не может не инлайниться. И не всё быстро, что инлайнится. Но видимо тебе лучше другой язык поискать надо, ПОБЫСТРЕЕ. Я понимаю...
никакие вызовы хранимых функций не инлайнятся
В смысле сохранённой ссылки на функцию?
как-то странно думать о "высоких материях", одновременно задавая вопросы про std::forward.. лямбды, конечно, намного лучше оптимизируются, но это не часто имеет значение
но всё же лямбды не хранят функцию
Обсуждают сегодня