0

次のスニペットを見てください。

struct Event
{
    void event1( time_t t );
    void event2( int, int );
}

Event* f = ...;

time_t t; int i1, int i2;

// 1st
std::thread t{ std::bind( &Event::event1, f, std::placeholders::_1 ), t };
std::thread t{ std::bind( &Event::event2, f, std::placeholders::_1, std::placeholders::_2 ), i1, i2 };

// 2nd method
std::thread t{ &Event::event1, f, t };
std::thread t{ &Event::event2, f, i1, i2 };

これは、1番目と2番目の方法の違いです。どの方法が良いですか?

4

1 に答える 1

2

Event最初のメソッドは、 を使用して、関数、そのインスタンス、およびそれぞれの引数の呼び出しラッパーを作成しますstd::bind。次に、これらの呼び出しラッパーをスレッド オブジェクトに渡します。

2 番目のメソッドは、関数、Eventインスタンス、および引数をスレッド オブジェクトに直接渡します。

最初の方法は不要なステップを実行しているように見えますが、両方の方法の結果は同じです。

std::bind個々のパラメーターの代わりにラッパーを渡す必要がある場合に使用します。例:

auto func = std::bind(&Event::event1, f, std::placeholders::_1);

functionTakingCallable(func);
functionTakingCallable2(func);
std::thread t(func, arg);
于 2013-11-05T14:24:52.090 に答える