如何使用std :: bind?

时间:2013-03-21 08:46:27

标签: c++ bind std

解释如何使用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是作为{{的第一个参数的函数的参数个数。 1}}。

然而,我发现另一种使用bind:

std::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

4 个答案:

答案 0 :(得分:8)

该行

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

相当于:

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

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

编辑:在准确性的名称中(由@ Roman指出,@ daramarak)两者不是实际上等同于直接调用函数:i通过值传递给std ::绑定。相当于直接用i调用foo的代码将是:

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

答案 1 :(得分:3)

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

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

单行版本:

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

答案 2 :(得分:2)

你的两个问题几乎相互回答。尾随()只是一个正常的函数调用。因此,表达式意味着:“将i绑定到foo;这将生成一个不带参数的函数;然后调用生成的函数。”由于代码的作者决定在被调用后不再需要该函数,因此它不会存储在任何地方。

答案 3 :(得分:0)

自行

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

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

foo(i);

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

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