Может ли std::async вызывать объекты std::function?

Можно ли вызывать объекты-функции, созданные с помощью std::bind, с помощью std::async. Следующий код не компилируется:

#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': шаблон-кандидат игнорируется: ошибка замены [с Fp = std::_1::function &, Args = ‹>]: нет типа с именем 'type ' в 'std::_1::__invoke_of, >

Просто невозможно использовать асинхронность с объектами std::function или я делаю что-то не так?

(Это компилируется с использованием Xcode 5 с компилятором Apple LLVM 5.0)


person Huhwha    schedule 29.09.2013    source источник
comment
откуда async получить аргументы функтора? Попробуйте передать std::function<void()>.   -  person juanchopanza    schedule 29.09.2013


Ответы (1)


Можно ли вызывать функциональные объекты, созданные с помощью std::bind, с помощью std::async

Да, вы можете вызвать любой функтор, если вы предоставите правильное количество аргументов.

Я делаю что-то неправильно?

Вы конвертируете связанную функцию, которая не принимает аргументов, в 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);});
person Mike Seymour    schedule 29.09.2013