我什么时候应该使用std :: bind?

时间:2013-03-24 12:44:40

标签: c++ c++11 lambda bind standard-library

每次我需要使用std::bind时,我最终会使用lambda。那我什么时候应该使用std::bind?我刚刚从一个代码库中删除它,我发现lambdas总是比std::bind更简单,更清晰。完全不需要std::bind吗?它不应该在将来被弃用吗?我应该何时更喜欢std::bind到lambda函数? (必须有一个原因,它与lambdas同时进入标准。)

我也注意到越来越多的人熟悉lambdas(所以他们知道lambdas做了什么)。但是,很少有人熟悉std::bindstd::placeholders

2 个答案:

答案 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而不是良好代码的示例,但它确实演示了多态调用包装。