2013-02-10 7 views
11

私はいくつかの引数を持つメンバ関数を持っています。私はそれを特定のオブジェクトインスタンスにバインドし、別の関数に渡したいと思います。パラメータの変更の数が、私はすべてのバインドが同様に呼び出しを変更する必要があるとき、1のために -std :: bindメンバー関数をオブジェクトインスタンスにバインドするための短い方法

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

をしかし、これは少し不器用です:私はプレースホルダでそれを行うことができます。しかし、さらに、すべてのプレースホルダをタイプするのは非常に退屈です。本当に必要なのは、オブジェクト参照を含む「関数ポインタ」を便利に作成することだけです。

だから、私は何をできるようにしたいのようなものです:

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

誰もがこれを行うにはいくつかの素晴らしい方法を知っていますか?

+0

は 'バインド(&MyClassの:: MyFunctionを、actualInstance、STD ::プレースホルダ::すべて)'この –

+0

[OK]を実行するような何かをできるようにする提案がなされてきた - それはありませんでしたなぜあなたは知っています標準に含まれていますか? –

+0

先月だけ提案されていたので、まだ誰もそれを実装していませんでした。まだ –

答えて

11

私はこれがうまくいくと思う:

その後、
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...); }; 
} 
+1

これは 'myFunction'がcv修飾されていないと仮定しているため、調整される必要があります –

+0

アドレスを指定し、 'instance。* func'の代わりに'(&instance) - > * func'を実行しましたか? – 0x499602D2

+0

@JonathanWakelyには過負荷を追加する以外にも、より良い方法がありますか? – Pubby

関連する問題