解释如何使用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
?
答案 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使代码复杂化没有意义。