假设我有一个带两个参数的函数,
void f(int x, int y);
我想绑定其中一个。我可以使用std::bind
,如下所示:
auto partiallyBoundF = std::bind(f, 10, _1);
partiallyBoundF
只接受一个参数,但我可以用多个参数调用它。超越第一个的论点甚至不必是一个有意义的类型:
partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
允许从bind
返回的对象传递额外参数的目的是什么?它允许编译调用错误,否则将被拒绝。
答案 0 :(得分:17)
忽略额外的参数实现起来要简单得多,实际上可能很有用。
在典型的实施例中,例如libstdc ++(g ++),采用的方法是将operator()
参数收集到元组中,然后让std::placeholder
绑定参数根据需要提取它们。执行参数计数需要计算使用占位符的数量,这将非常复杂。请注意,bind callable可以是具有多个或模板化operator()
调用模式的仿函数,因此无法使用单个“正确”签名生成绑定对象operator()
。
另请注意,您可以写:
std::bind(&foo, std::placeholders::_1, std::placeholders::_3);
即。显式忽略绑定对象的第二个参数。如果bind
强制执行其参数计数,则需要另外一种方法来指定第四个论点也被忽略了。
至于有用性,请考虑将成员信号处理程序绑定到信号:
sig.connect(std::bind(&C::on_sig, this, param, std::placeholders::_1));
如果sig
有额外的无用发射参数,那么bind
对象就会忽略它们;否则,将相同的处理程序绑定到多个信号将需要编写多个转发包装器,而不是真正的目的。