Использование std::async
Мне было интересно, возможно ли иметь вспомогательную функцию, которая создает std::future
из коллекции (одно будущее для каждого элемента коллекции).std :: async вариант, который работает над коллекцией
Часто у меня следующая ситуация:
auto func = [](decltype(collection)::reference value) {
//Some async work
};
typedef std::result_of<decltype(func)>::type ResultType;
std::vector<std::future<ResultType>> futures;
futures.reserve(collection.size());
// Create all futures
for(auto& element : collection) {
futures.push_back(std::async(func, element));
}
// Wait till futures are done
for(auto& future : futures) {
future.wait();
}
Чтобы иметь возможность повторно использовать это я придумал следующий частичный код:
template< class Function, class CT, class... Args>
std::vector<std::future<typename std::result_of<Function(Args...)>::type>>
async_all(Function&& f, CT& col) {
typedef typename std::result_of<Function(Args...)>::type ResultType;
std::vector<std::future<ResultType>> futures;
futures.reserve(collection.size());
for(auto& element : collection) {
futures.push_back(std::async(func, element));
}
}
return futures;
Теперь я должен решить Args
проблему, поскольку в async_all
, Args
больше не может быть выведено. Единственное, о чем я сейчас думаю, это еще один функтор, который преобразует элемент в коллекции в Args
. Есть ли еще более элегантное решение?