5

重複の可能性:
メンバー関数でスレッドを開始します

私はC++に非常に慣れていません。私の経験は主にjavascriptとjavaでした。

私はLionでXcodeを使用しています。次のコードは、コンパイルエラーを表示します。「非静的メンバー関数への参照を呼び出す必要があります。引数なしで呼び出すつもりでしたか?」

class MyClass {
private:
    void handler() {
    }

public:
    void handleThings() {
        std::thread myThread(handler);
    }
};

this->handler、、およびその他のバリエーションも試し&handlerましたが、どれも機能しませんでした。このコードはコンパイルされ、私が望むことを達成します。

class MyClass {
private:
    void handler() {
    }

public:
    void handleThings() {
        std::thread myThread([this]() {
            handler();
        });
    }
};

メンバー関数への参照を渡せないのはなぜですか?私の回避策は最善の解決策ですか?

4

3 に答える 3

15
std::thread myThread(&MyClass::handler, this);
myThread.join();
于 2013-01-22T11:25:36.093 に答える
5

std::mem_funラムダを使用したくない場合は、を使用できます。

あなたはこれを行うことができますか?

std::thread myThread(std::mem_fun(&MyClass::handler),this);

std::threadは関数への引数 (最初の引数) を受け取り this、引数としてオブジェクトに渡されます。mem_funオブジェクトは、 のハンドラ関数を呼び出しますthis

以下の礼儀を非常に簡単に行うこともできます-メンバー関数でスレッドを開始する

std::thread myThread(&MyClass::handler,this);
于 2013-01-22T07:15:52.277 に答える
5

lambdaメンバー関数内でクラス メンバーにアクセスするために使用します。キャプチャする必要がありますthis[this]以下のコードでは必須です:

void handleThings() 
{
    std::thread myThread([this]() {
        handler();
    });
}

参照によってキャプチャできますがthis、値によってキャプチャするほど効率的ではありません。参照を通過するには、二重間接参照が必要になるため (モジュロ コンパイラの最適化)

void handleThings() {
        std::thread myThread([&]() {
            handler();
        });
    }

Lambdas通常は よりも適切な選択ですbind

  • 読者が理解しやすくなります。
  • もっと効率的。
于 2013-01-22T07:21:29.697 に答える