bind_front
binds the first X parameters, but if the callable calls for more parameters, they get tacked onto the end. This makes bind_front
very readable when you're only binding the first few parameters of a function.
The obvious example would be creating a callable for a member function that is bound to a specific instance:
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);
The bind_front
version is a lot less noisy. It gets right to the point, having exactly 3 named things: bind_front
, the member function to be called, and the instance on which it will be called. And that's all that our situation calls for: a marker to denote that we're creating a binding of the first parameters of a function, the function to be bound, and the parameter we want to bind. There is no extraneous syntax or other details.
By contrast, the lambda has a lot of stuff we just don't care about at this location. The auto... args
bit, the std::forward
stuff, etc. It's a bit harder to figure out what it's doing, and it's definitely much longer to read.
Note that bind_front
doesn't allow bind
's placeholders at all, so it's not really a replacement. It's more a shorthand for the most useful forms of bind
.
bind_front
being that much simpler and more restricted thanbind
with all its bells and whistles. Much smaller implementation that should be easy for the optimizer to see right through. – Illnatured