2012-04-11 8 views
2

少し密度が高いかもしれませんが、下の行は何を理解できませんか?私は、オブジェクトを呼び出します(my_threadを命名)スレッド作成さを実現C++で演算子のオーバーロードを理解しています

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

background_task f; 
std::thread my_thread(f); 
  1. クラスbackground_taskfが、ときに、クラスbackground_task内の関数operator()が実際に呼ばれているのですか?

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

  3. 私はこれがC++ 101または非常に基本的だと理解していますが、それでも理解できません。そのため、C++のトピックについて詳しく知るにはどの書籍を参照するべきですか。

+1

これは、[演算子のオーバーロード](http://stackoverflow.com/q/4421706/1025391)ではなく、C++ファンクタについてです。あなたの質問への詳細な回答については、この投稿:http://stackoverflow.com/a/356993/1025391を参照してください。 – moooeeeep

+1

心配はいりません。これはC++ 101ではありません。初心者のC++クラスはスレッドをカバーしませんし、カスタム関数呼び出し演算子をカバーしていない可能性もあり、独自のクラスを記述することさえできないかもしれません。 –

答えて

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(). 

、それはとてもそれを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)を呼び出すのと同等の処理を行います。

編集:元々は、過負荷がかかっていないと主張しました。それは完全にはっきりしていないので、私は答えを言い換えました。

+0

まあ、それは技術的に間違っていますが、カスタム演算子の実装を "演算子のオーバーロード"と呼ぶのはよくあることです。残念ながら、話し言葉は必ずしも意味をなさない。 – bitmask

+0

@bitmask今あなたは私の考えを持っています。もし特定の型に対して既に定義されているものをオーバーロードするのではなく、この場合オペレータvoid(void)をオーバーロードしていると思うならば、結局はオーバーロードしているかもしれません... – juanchopanza

+0

最初の暗黙のパラメータ( 'this')は常に呼び出される関数を決定します。私は 'void X :: foo()'と 'void Y :: foo()'は同じ名前で(論理的な)引数だけが異なるにもかかわらず、 'foo'のオーバーロードとは言いません。同じ理由が 'void operator()()const'にも当てはまります。しかし、私はニックピッキングしています:) – bitmask

1
  1. スレッドオブジェクトstd::thread(f, a, b, c)は、(のはcopy_of_fそれを呼びましょう)オブジェクトfのコピーを作成し、新しい実行コンテキストのエントリポイントは、コールcopy_of_f(a, b, c)(またはより冗長に、copy_of_f.operator()(a, b, c))です。

  2. オブジェクトff(a, b, c)が意味をなす必要があることを意味し呼び出し可能なエンティティ、でなければなりません。

  3. 特にC++ 11に関する書籍はまだ書かれています。今年後半にStroustrup、Meyersなどを探す。それまでは、インターネットがおそらく最善の策です。

関連する問題