LINUX.ORG.RU

std::bind vs lambda

 , ,


1

5

Есть метод, который принимает callback:

void Bar::setCallback(const std::function<void(int, int)> &cb) {}

Я туда хочу передать метод класса, соответственно есть два пути:

// Метод, который передаём
void Foo::callback(int a, int b) {}

// Путь первый
bar->setCallback(std::bind(&Foo::callback, this, std::placeholders::_1, std::placeholders::_2));

// Путь второй
bar->setCallback([this] (int a, int b) { callback(a, b); });

Какой путь лучше, если рассмотреть с разных точек зрения: удобство написания, читаемость, может быть быстродействие и размер, если критично? Ваше личное мнение.

★★★★★

Последнее исправление: ox55ff (всего исправлений: 1)

без разницы, используй любой. посколько в интерфейсе торчит std::function, то лямбда всё равно будет преобразована к ней, так же как и std::bind, что тебе больше нравится, в любом случае ты получишь функтор который вызывается в рантайме.

чтобы заюзать лямбды на 100% тебе надо переделать интерфейс так:

void Bar::setCallback(auto cb) { cb(); }

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

я лично думаю, что лямбда всё равно читаемее. std::bind - это когда тебе надо создать руками (частичное) замыкание, что лямбда тоже может сделать. оно бывает полезно когда тебе надо одну функцию преобразовать в другую функцию, чего ты тут не делаешь, поэтому std::bind тебе наверное тоже не нужен, так что фигачь лучше лямбды.

anonymous
()
Ответ на: комментарий от anonymous

Есть метод, который принимает callback:

void Bar::setCallback(const std::function<void(int, int)> &cb) {}

сорри... я тут мимокрокодил, я бы это переделал на:

template<typename Function, typename Class, typename Tuple>
auto Bar::applyCallback(Function f, Class c, Tuple t)

+ std::apply внутри... либо если не с++17 и еще распаковка через std::index_sequence, вам точно пары int хватает?

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 2)
Ответ на: комментарий от anonymous

если ты лямбду куда-то присваиваешь

Да, я сохраняю в поле класса. Потом вызываю, если понадобится.

ox55ff ★★★★★
() автор топика
Ответ на: комментарий от ox55ff

тогда не парься, через что бы ты ни сделал, в конце концов ты свё равно получишь std::function. смотри что тебе и другим читабельнее, результат будет одинаковый.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.