7

std::async を使用して std::bind で作成された関数オブジェクトを呼び出すことは可能ですか? 次のコードはコンパイルに失敗します。

#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;
}

エラーは次のとおりです。

'async' の呼び出しに一致する関数がありません: 候補テンプレートは無視されました: 置換の失敗 [with Fp = std:: _1::function &, Args = <>]: 'std:: _1::__invoke_ofに 'type' という名前の型がありません、 >

std::function オブジェクトで async を使用することはできませんか、それとも何か間違っていますか?

(これは Apple LLVM 5.0 コンパイラで Xcode 5 を使用してコンパイルされています)

4

1 に答える 1

14

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

はい、適切な数の引数を指定する限り、任意のファンクターを呼び出すことができます。

私は何か間違ったことをしていますか?

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

正しい署名を指定できます。

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);});
于 2013-09-29T14:34:49.710 に答える