2017-10-23 10 views
0

私は、クラスメソッドであるargunmentを持つスレッドを作成する一般的な方法を生成しようとしています。しかし、私は正常にコンパイルし、次のエラーがC++ 11プロキシを使用してスレッドにメンバー関数を渡す

In static member function 'static R proxy<R (T::*)(Args ...), mf>::call(T&, Args&& ...)': 
24:22: error: expected unqualified-id before '*' token 
+0

'スレッドT(MFは、&obj);は'それはそれはコンパイルになるだろう。しかし、ので、それは実行されません)あなたは、スレッドへの引数の残りを渡す必要があり、およびb)あなたができるように 'スレッドオブジェクトを結合または分離せずに破棄することができます。これは未定義の動作を示します。 –

+0

ありがとうございました。スレッドの残りの引数を意味するものは、fはvoid関数です。デタッチと参加についてあなたは正しいです。もちろんそれは必要です。 –

+0

さて、あなたのコードは、現在スレッドに転送していない任意の数の 'Args ...'を渡すことを想定しています。 'sizeof ...(Args)'がゼロになる特定の例題のために、実際にはうまくいくでしょう。 –

答えて

1
thread t(&T::*mf, &obj); 

&T::*mfに生成されると、私は次のコード

#include <iostream> 
#include <thread> 
#include <functional> 
using namespace std; 

class hello{ 
public: 
    void f(){ 
     cout<<"f"<<endl; 
    } 
    virtual void ff(){ 
     cout<<"ff"<<endl; 
    } 
}; 

template <typename T, T> struct proxy; 

template <typename T, typename R, typename ...Args, R (T::*mf)(Args...)> 
struct proxy<R (T::*)(Args...), mf> 
{ 
    static R call(T & obj, Args &&... args) 
    { 
    // function func = T::*mf; 
     thread t(&T::*mf, &obj); 
     return (obj.*mf)(std::forward<Args>(args)...); 
    } 
}; 
int main(){ 
    hello obj; 
    typedef proxy<void(hello::*)(), &hello::f> hello_proxy; 
    hello_proxy::call(obj); 
} 

使うコード をコンパイルすることはできませんよ間違った構文です。ちょうどmfを使用してください。

thread t(mf, &obj); 
関連する問題