每次我需要使用std::bind
时,我最终会使用lambda。那我什么时候应该使用std::bind
?我刚刚从一个代码库中删除它,我发现lambdas总是比std::bind
更简单,更清晰。完全不需要std::bind
吗?它不应该在将来被弃用吗?我应该何时更喜欢std::bind
到lambda函数? (必须有一个原因,它与lambdas同时进入标准。)
我也注意到越来越多的人熟悉lambdas(所以他们知道lambdas做了什么)。但是,很少有人熟悉std::bind
和std::placeholders
。
答案 0 :(得分:29)
这是lambda无法做到的事情:
std::unique_ptr<SomeType> ptr = ...;
return std::bind(&SomeType::Function, std::move(ptr), _1, _2);
Lambdas无法捕获仅移动类型;它们只能通过复制或左值引用来捕获值。尽管如此,这是一个暂时的问题,正在积极解决C ++ 14;)
“更简单,更清晰”是一个意见问题。对于简单的绑定案例,bind
可以减少很少的输入。 bind
也只关注功能绑定,所以如果你看到std::bind
,你知道你在看什么。然而,如果你使用lambda,你必须查看lambda实现以确定它的作用。
最后,C ++不会因为某些其他功能可以执行的操作而弃用。 auto_ptr
已被弃用,因为本质上是危险的,并且存在非危险的替代方案。
答案 1 :(得分:23)
您可以使用std::bind
创建多态对象,但不能使用lambdas,即std::bind
返回的调用包装器可以使用不同的参数类型调用:
#include <functional>
#include <string>
#include <iostream>
struct Polly
{
template<typename T, typename U>
auto operator()(T t, U u) const -> decltype(t + u)
{ return t + u; }
};
int main()
{
auto polly = std::bind(Polly(), std::placeholders::_1, "confusing");
std::cout << polly(4) << polly(std::string(" this is ")) << std::endl;
}
我将其创建为puzzle而不是良好代码的示例,但它确实演示了多态调用包装。