#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
答案 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
的参数,并将该值传递给绑定对象,而忽略它