2012-08-10 3 views
12

私はstd::functionに格納された可変数のパラメータを持つメンバ関数を持っています。インスタンスをバインドして独立した関数オブジェクトを取得します。引数の固定数のためにバインディングメンバは可変的に機能します

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    std::function<R(Args...)> = /* bind the instance c into the function? */ 
} 

// ... 

Class c; 
connect(c, &Class::foo); 

私はstd::bindを使用したいが、私は可変長のパラメータのためにこれを行う方法が表示されません。すでに引数と、すべての量を持っているので

+0

どのように正確にあなたが 'Argsのを取得しませんか...'? – Xeo

+0

さて、私は違うコードを書いた、うまくいけば、このように理解できる。 –

+0

はい、そうです。そして、ソリューションを簡単にします。 :) – Xeo

答えて

15

ソリューションは、非常に簡単です:

template <class T, class R, class... Args> 
void connect(const T& t, std::function<R(const T&, Args...)> f) { 
    // or capture 't' by-value 
    std::function<R(Args...)> fun = [&t,f](Args... args){ f(t,args...); }; 
    // ... 
} 

Live example.

+0

これはコールスタック上に追加レイヤーを追加します。つまり、副作用がないように 'std :: forward'マジックを追加する必要があります。 –

+4

@lucas:賢明な完璧なフォワーディング魔法でさえ、 'std :: function'を通して魔法のように呼び出しを消さないでしょう。 ;) – Xeo

+0

:Pしかし、必要以上に物をコピーすることはありません。 –

関連する問題