Можно ли вызывать объекты функций, созданные с помощью 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)
Можно ли вызывать объекты функций, созданные с
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);});
Других решений пока нет …