2
#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 的函数还是出于某些目的而设计?(例如,强制用户不要忘记函数的声明已经是什么样子?)

我用vs2012

4

2 回答 2

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);}.

于 2012-08-31T21:14:23.840 回答
1

您必须在两个地方查看参数:在对 的调用中bind(),参数成为绑定对象的一部分;在对绑定对象本身的调用中,参数被传递给在原始文件中建立的占位符打电话给bind(). 在此处的示例中,对 的调用中没有占位符bind(),因此对绑定对象的调用中不需要任何参数。如果你用比它需要的更多的参数调用它,多余的参数将被忽略。

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

于 2012-09-01T12:18:48.367 回答