如何只传递绑定函数的第二个参数?
How to pass only second argument of a bind function?
我正在使用通用 EventEmitter 实例:
EventEmitter mEventHandler;
所以我定义了这个绑定:
function<void(int, double)> onSetMin = bind(&ILFO::SetMin, this, placeholders::_2);
mEventHandler.on(kParamID, onSetMin);
和 on
例如:
mEventHandler.emit(paramID, someInt, someDouble);
如前所述,即"generic",并设置2个参数。但是我的特定函数 SetMin
只需要一个参数(在这种情况下是 someDouble
):
void ILFO::SetMin(double min);
你如何从 bind 传递第二个参数?
我认为使用 lambda 更容易解决您的问题:
function<void(int, double)> onSetMin = [this](int dummy, double d) { SetMin(d); };
mEventHandler.on(kParamID, onSetMin);
使用 lambda 代替 std::bind
:
mEventHandler.on(kParamID, [this] (int, double value) {
SetMin(value);
});
std::bind
的目的与您想要做的相反:它帮助您创建一个函数,该函数接受 N
个参数,而函数 f
接受 M
其中 M > N
通过将 f
的一些参数固定为给定值(or/and 更改参数的顺序)。
根据 C++ 参考,在 std::bind
调用中您可以使用
unbound arguments replaced by the placeholders _1, _2, _3... of
namespace std::placeholders
https://en.cppreference.com/w/cpp/utility/functional/bind
using namespace std::placeholders; // for _1, _2, _3...
// demonstrates argument reordering and pass-by-reference
int n = 7;
// (_1 and _2 are from std::placeholders, and represent future
// arguments that will be passed to f1)
auto f1 = std::bind(f, _2, 42, _1)
我正在使用通用 EventEmitter 实例:
EventEmitter mEventHandler;
所以我定义了这个绑定:
function<void(int, double)> onSetMin = bind(&ILFO::SetMin, this, placeholders::_2);
mEventHandler.on(kParamID, onSetMin);
和 on
例如:
mEventHandler.emit(paramID, someInt, someDouble);
如前所述,即"generic",并设置2个参数。但是我的特定函数 SetMin
只需要一个参数(在这种情况下是 someDouble
):
void ILFO::SetMin(double min);
你如何从 bind 传递第二个参数?
我认为使用 lambda 更容易解决您的问题:
function<void(int, double)> onSetMin = [this](int dummy, double d) { SetMin(d); };
mEventHandler.on(kParamID, onSetMin);
使用 lambda 代替 std::bind
:
mEventHandler.on(kParamID, [this] (int, double value) {
SetMin(value);
});
std::bind
的目的与您想要做的相反:它帮助您创建一个函数,该函数接受 N
个参数,而函数 f
接受 M
其中 M > N
通过将 f
的一些参数固定为给定值(or/and 更改参数的顺序)。
根据 C++ 参考,在 std::bind
调用中您可以使用
unbound arguments replaced by the placeholders _1, _2, _3... of namespace std::placeholders
https://en.cppreference.com/w/cpp/utility/functional/bind
using namespace std::placeholders; // for _1, _2, _3... // demonstrates argument reordering and pass-by-reference int n = 7; // (_1 and _2 are from std::placeholders, and represent future // arguments that will be passed to f1) auto f1 = std::bind(f, _2, 42, _1)