12

いくつかの引数を持つメンバー関数があります。それを特定のオブジェクト インスタンスにバインドし、これを別の関数に渡したいと思います。私はプレースホルダーでそれを行うことができます:

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

しかし、これは少し不器用です。たとえば、パラメーターの数が変更されると、すべてのバインド呼び出しも変更する必要があります。しかし、さらに、オブジェクト参照を含む「関数ポインタ」を簡単に作成したいだけなのに、すべてのプレースホルダを入力するのは非常に面倒です。

だから私ができるようにしたいのは次のようなものです:

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

誰かがこれを行うための良い方法を知っていますか?

4

1 に答える 1

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...); };
}
于 2013-02-10T22:28:41.680 に答える