使用std::async
我想知道是否有可能有一个辅助函数,它创建std::future
从一个集合(一个未来每个集合元素)秒。
我常常有以下情况:
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
。 有没有更好的解决方案来呢?