Может ли 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 :: функция &, Args = <>]: нет типа с именем ‘type’ в ‘std ::_1 :: __ invoke_of,>

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

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

6

Решение

Можно ли вызывать объекты функций, созданные с 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);});
12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]