使用std :: ref参数调用函数std :: bind(ed)

时间:2012-08-31 21:08:19

标签: c++ c++11

#include <functional>
#include <iostream>

struct Test
{
    void fnc(int & a) { ++a; }
};

int main ()
{
    typedef std::function<void(int)> Func;

    int i = 0;
    Test t;
    Func f = std::bind(&Test::fnc, &t, std::ref(i));
    //f(); //error C2064: term does not evaluate to a function taking 0 arguments
    f(37); //Here I am forced to pass evidently unused int
    std::cout << i;
}

我使用它吗?

是否真的有必要传递一些随机的int?

如果是这样,那为什么? 是因为模板的魔力有限,而且我实际上必须将int传递给函数服用int OR是出于某些目的而设计的吗? (例如,强迫用户不要忘记函数声明的样子如何?)

我使用vs2012

2 个答案:

答案 0 :(得分:5)

不不不:你所拥有的是一个带参数的函数,因为一切都已经绑定了!您需要以下两种之一:

std::function<void()> f = std::bind(&Test::fnc, &t, std::ref(i));

std::function<void(int&)> g = std::bind(&Test::fnc, &t, std::placeholders::_1);

现在有以下两个效果t.fnc(i)

f();  // OK, bound to `i` always.

g(i); // Same effect

请注意,如果可能,您应该将绑定函数声明为auto,这样效率更高。第三个选项是闭包表达式[&i,&t](){t.fnc(i);}

答案 1 :(得分:1)

有两个地方你必须查看参数:在bind()的调用中,参数成为绑定对象的一部分,在调用绑定对象本身时,参数传递给在bind()的原始调用中建立的占位符。在这里的示例中,bind()的调用中没有占位符,因此在调用绑定对象时不需要任何参数。如果你用更多的参数来调用它,那么额外的参数就会被忽略。

此处的代码通过将图层包装到std::function对象中来向绑定对象添加图层。为std::function对象定义的签名(此处为std::function<void(int)>)确定如何调用该对象:它接受类型为int的参数,并将该值传递给绑定对象,而忽略它