5

一个解释如何std::bind使用的简单示例如下:

假设我们有一个有 3 个参数的函数:f3(x, y, z)。我们希望有一个定义为 2 个参数的函数f2(x,y) = f3(x,5,y):在 C++ 中,我们可以很容易地做到这一点std::bind

auto f2 = std::bind(f3, _1, 5, _2);

这个例子对我来说很清楚:std::bind将一个函数作为它的第一个参数,然后它接受 n 个其他参数,其中 n 是作为第一个参数的函数的参数数std::bind

但是,我发现了 bind 的另一种用法:

void foo( int &x )
{
  ++x;
}


int main()
{
  int i = 0;

  // Binds a copy of i
  std::bind( foo, i ) (); // <------ This is the line that I do not understand.
  std::cout << i << std::endl;

}

很明显,foo有一个参数,并且std::bind设置为i。但是为什么我们要在 之后使用另一对括号(foo, i)呢?为什么我们不使用输出std::bind?我的意思是,为什么我们没有auto f = std::bind(foo, i)

4

4 回答 4

8

线

std::bind( foo, i ) ();

相当于:

auto bar = std::bind( foo, i );
bar();

它创建一个绑定函子,然后立即调用它(使用第二对括号)。

编辑:以准确性的名义(@Roman,@daramarak 指出)这两者实际上并不等同于直接调用函数:i 按值传递给 std::bind。相当于foo直接用 i 调用的代码是:

auto bar = std::bind( foo, std::ref(i) );
bar();
于 2013-03-21T08:49:46.353 回答
3

它绑定foo到一个临时对象,然后立即调用它:

  auto f = std::bind(foo, i);
  f();

单行版本:

std::bind(foo, i)();
于 2013-03-21T08:51:59.457 回答
2

您的两个问题几乎可以相互回答。尾随()只是一个普通的函数调用。因此,表达式的意思是:“绑定ifoo;这将产生一个不带参数的函数;然后调用结果函数。” 由于代码作者决定调用该函数后不再需要它,因此它不会存储在任何地方。

于 2013-03-21T08:50:30.747 回答
0

由于线

std::bind( foo, i ) () ;

......做同样的事情......

foo(i);

...这并不是您在实际代码中可能遇到的 std::bind 的真正“使用”,但它确实可以作为 std::bind 作用的简单说明,如其他答案中所述。

正如您所指出的,通常的情况是存储绑定的结果并在其他地方调用它,否则首先使用 std::bind 使代码复杂化是没有意义的。

于 2014-02-24T18:59:04.347 回答