2

私は少し密集しているかもしれませんが、下の行が何をするのか理解できませんか?

class background_task
{
  public:
    void operator()() const
    {
      do_something();
      do_something_else();
    }
};

background_task f;
std::thread my_thread(f);
  1. クラスのmy_threadオブジェクトを呼び出すスレッド(という名前)が作成されていることに気付きましたが、クラスの関数が実際に呼び出されるのはいつですか?fbackground_taskoperator()background_task

  2. 関数演算子のオーバーロードが必要なのはなぜですか?

  3. これがC++ 101または非常に基本的なものであることは理解していますが、まだ理解できないので、C++のそのようなトピックについてさらに学ぶためにどの本を参照すればよいでしょうか.

4

2 に答える 2

2

この定義はoperator()()

class background_task
{
public:
void operator()() const
{
  do_something();
  do_something_else();
}
};

これは、background_task をインスタンス化して呼び出すことができることを意味します (この場合は引数なしで)。それはそれを「呼び出し可能なエンティティ」にします:

background_task f;
f(); // calls foo::operator ()(), i.e calls do_something() and do_something_else().

スレッドに関しては、パラメーターを取らない呼び出し可能なエンティティーが必要なので、a のインスタンスを渡せばbackground_task問題ありません。background_task呼び出し可能でない場合、以下はコンパイルされません:

background_task f;
std::thread my_thread(f);

コンストラクターでは、パラメーターがある場合、呼び出し可能なエンティティの引数を渡すこともできます。std::threadたとえば、

class background_task
{
public:
void operator()(double x) const
{
  // do something with x, if you want
  do_something();
  do_something_else();
}
};

で動作します

background_task f;
std::thread my_thread(f, 3.1416);

内部的には、スレッドは f(3.1416) の呼び出しと同じことを行います。

編集:もともと、オーバーロードは関係ないと主張しました。それは完全に明確ではないので、答えを言い換えました。

于 2012-04-11T17:41:39.397 に答える
1
  1. スレッド オブジェクトstd::thread(f, a, b, c)はオブジェクトのコピーを作成しf(それを と呼びましょうcopy_of_f)、新しい実行コンテキストのエントリ ポイントは呼び出しcopy_of_f(a, b, c)(より詳細にはcopy_of_f.operator()(a, b, c)) です。

  2. オブジェクトfcallable entityである必要があります。つまり、式は意味のあるものでf(a, b, c)なければなりません。

  3. 特に C++11 に関する本は、まだ執筆中です。今年後半には、Stroustrup、Meyers などに注目してください。それまでは、インターネットがおそらく最善の策です。

于 2012-04-11T18:11:01.703 に答える