2013-09-29 13 views
6

std :: asyncを使用してstd :: bindで作成された関数オブジェクトを呼び出すことは可能ですか?std :: asyncはstd :: functionオブジェクトを呼び出すことができますか?

#include <iostream> 
#include <future> 
#include <functional> 

using namespace std; 

class Adder { 
public: 
    int add(int x, int y) { 
     return x + y; 
    } 
}; 

int main(int argc, const char * argv[]) 
{ 
    Adder a; 
    function<int(int, int)> sumFunc = bind(&Adder::add, &a, 1, 2); 
    auto future = async(launch::async, sumFunc); // ERROR HERE 
    cout << future.get(); 
    return 0; 
} 

エラーは次のとおりです:次のコードはコンパイルに失敗し

'非同期' への呼び出しに該当する機能: 候補テンプレート無視:置換の失敗[Fpと=のstd :: _1と: :機能&は、のArgs = <>]:STD」に 'タイプ' という名前の無いタイプ:: _1 :: __ invoke_of、>

は、それがのstd ::関数オブジェクトと非同期(async)を使用するだけで可能ではないか、私は何か間違っている?

+0

'async'はファンクタの引数をどこから得るのですか? 'std :: function 'を渡してみてください。 – juanchopanza

答えて

12

はい、あなたはどんなファンクタを呼び出すことができますstd::async

使用std::bindで作成した関数オブジェクトを呼び出すことも可能です(これは、Apple LLVM 5.0コンパイラでのXcode 5を使用してコンパイルされています)あなたが正しい数の議論を提供している限り。

私は何か間違っていますか?

引数を取らないバインド関数を2つの引数を取ります(無視する)function<int(int,int)>に変換しています。引数なしで起動しようとしています。

あなたは正しい署名を指定することができます。

function<int()> sumFunc = bind(&Adder::add, &a, 1, 2); 

またはfunctionを作成するオーバーヘッドを避ける:

auto sumFunc = bind(&Adder::add, &a, 1, 2); 

か全くbindを気:

auto future = async(launch::async, &Adder::add, &a, 1, 2); 

かラムダを使用する:

auto future = async(launch::async, []{return a.add(1,2);}); 
関連する問題