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);
'スレッドT(MFは、&obj);は'それはそれはコンパイルになるだろう。しかし、ので、それは実行されません)あなたは、スレッドへの引数の残りを渡す必要があり、およびb)あなたができるように 'スレッドオブジェクトを結合または分離せずに破棄することができます。これは未定義の動作を示します。 –
ありがとうございました。スレッドの残りの引数を意味するものは、fはvoid関数です。デタッチと参加についてあなたは正しいです。もちろんそれは必要です。 –
さて、あなたのコードは、現在スレッドに転送していない任意の数の 'Args ...'を渡すことを想定しています。 'sizeof ...(Args)'がゼロになる特定の例題のために、実際にはうまくいくでしょう。 –