std :: bind成员函数到对象实例的简短方法,没有绑定参数

时间:2013-02-10 22:02:50

标签: c++ stdbind

我有一个带有多个参数的成员函数。我想将它绑定到特定的对象实例并将其传递给另一个函数。我可以用占位符来做到这一点:

// actualInstance is a MyClass*
auto callback = bind(&MyClass::myFunction, actualInstance, _1, _2, _3);

但这有点笨拙 - 例如,当参数数量发生变化时,我也必须更改所有绑定调用。但另外,键入所有占位符是相当繁琐的,当我真正想要的是方便地创建包含对象引用的“函数指针”时。

所以我希望能够做的是:

auto callback = objectBind(&MyClass::myFunction, actualInstance);

有没有人知道这样做的好方法?

1 个答案:

答案 0 :(得分:12)

我认为这会奏效:

template<typename R, typename C, typename... Args>
std::function<R(Args...)> objectBind(R (C::* func)(Args...), C& instance) {
    return [=](Args... args){ return (instance.*func)(args...); };
}

然后:

auto callback = objectBind(&MyClass::myFunction, actualInstance);

注意:您需要重载来处理CV限定的成员函数。即:

template<typename R, typename C, typename... Args>
std::function<R(Args...)> objectBind(R (C::* func)(Args...) const, C const& instance) {
    return [=](Args... args){ return (instance.*func)(args...); };
}