функцию?
Сейчас у меня есть функция, принимающая callable:
class ICallable {
public:
virtual void operator()() = 0;
};
void foo(Callable& f) { ... }
Но каждый раз создавать класс-наследник геморно, хочется передавать просто lambda
Как любит говорить @webreh Костя, любую проблему дизайна можно решить с помощью std::function. Замени Callable на std::function и передавай лябмбду
лямбду же кастовать надо ещё
Куда? К чему?
к std::function
Судя по всему, здесь больше подойдёт function_ref (в std нет) - не будет аллокаций, но и владения у foo не будет. P.S. При желании можно написать template <class Lambda> class LambdaCallable : public ICallable { Lambda lambda; void operator()() { lambda(); } final }; и сделать implicit конструктор от лямбды. Будет тот же function_ref, но на минималках.
small object optimization buffer вроде бы должен быть достаточно большой, чтобы function_ref передать как function путём [&]
Да, SOO гарантируется для объектов размером с std::reference_wrapper
Интересное ограничение. В стандарте, ЕМНИП, его нет. На практике у каждого вендора свое (и там пара void* минимум влезет обычно)
В своё время я измерял: MSVC расщедрился аж на 40 байт, у GCC (10 вроде) было 16, а вот древняя Мингва - 8...
Вот число 40 у меня тоже где-то в памяти лежало, а mingw можно не учитывать, думаю
Обсуждают сегодня