为什么从绑定返回的对象忽略额外的参数

Why do objects returned from bind ignore extra arguments?

本文关键字:参数 对象 绑定 返回 为什么      更新时间:2023-10-16

假设我有一个函数,该函数需要两个参数,

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返回的对象通过额外参数的目的?它允许调用错误编译,以拒绝其他地方。

忽略额外的参数要简单得多,实际上可以很有用。

在典型的实现中,例如libstdc (g ),采用的方法是将operator()参数收集到元组中,然后让std::placeholder绑定参数根据需要提取它们。执行论点数量将需要计算二手占位持有人的数量,这将非常复杂。请注意,绑定可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对象只会忽略它们。否则,将同一处理程序绑定到多个信号将需要编写多个转发包装器,而没有真正的目的。