bind_front
связывает первые параметры X, но если вызываемый объект требует дополнительных параметров, они прикрепляются к концу. Это делает bind_front
очень удобочитаемым, когда вы привязываете только несколько первых параметров функции.
Очевидным примером может быть создание вызываемого объекта для функции-члена, привязанной к конкретному экземпляру c:
type *instance = ...;
//lambda
auto func = [instance](auto &&... args) -> decltype(auto) {return instance->function(std::forward<decltype(args)>(args)...);}
//bind
auto func = std::bind_front(&type::function, instance);
Версия bind_front
- много менее шумная. Он переходит прямо к делу, имея ровно 3 именованных объекта: bind_front
, вызываемую функцию-член и экземпляр, для которого она будет вызываться. И это все, что требуется в нашей ситуации: маркер для обозначения того, что мы создаем привязку первых параметров функции, функции, которую нужно связать, и параметра, который мы хотим привязать. Нет никакого постороннего синтаксиса или других деталей.
Напротив, лямбда содержит много вещей, которые нас просто не волнуют в этом месте. Бит auto... args
, материал std::forward
и т. Д. c. Немного сложнее понять, что он делает, и определенно намного дольше читать.
Обратите внимание, что bind_front
вообще не позволяет использовать заполнители bind
, поэтому на самом деле это не замена. Это скорее сокращение для наиболее полезных форм bind
.