为什么从绑定返回的对象忽略额外的参数
Why do objects returned from bind ignore extra arguments?
假设我有一个函数,该函数需要两个参数,
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
对象只会忽略它们。否则,将同一处理程序绑定到多个信号将需要编写多个转发包装器,而没有真正的目的。
相关文章:
- 如何使用Visual Studio 2017在C++中为参数化对象数组使用唯一指针
- Arduino C++在构造函数中用参数声明对象数组
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 如何在不使用指针的情况下将派生类的对象作为参数传递给基类中的函数?
- C++ 类对象作为函数参数
- 如何将对象数组作为参数传递给模板
- 使用向量初始化参数化构造函数的对象数组
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 如何编写将展开以定义具有模板参数的对象的宏
- C++类对象 - 遍历基于参数的对象
- 将指针传递到成员的指针,从模板参数包到函数对象
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 是否可以获取成员函数模板参数的拥有对象?
- C++多参数对象创建
- 在不创建参数对象的情况下解析constexpr函数
- 推断模板参数对象成员的类型
- 如何解析c++ v8中的参数对象
- 当默认参数对象被销毁时
- 为什么函数不能更改其参数对象的地址/引用值?