#include // using std::future, std::async, std::launch #include // using std::transform, std::for_each #include // using std::back_inserter #include // using std::mem_fn #include // using std::vector #include // using std::string #include // using std::cout, std::endl namespace { std::string operation(const std::string& input) { return input + " bar"; } } int main() { std::vector inputs(10, std::string("foo")); // fork std::vector > futures; auto start_async = [](const std::string& input) { return std::async(std::launch::async, operation, input); }; std::transform(inputs.cbegin(), inputs.cend(), std::back_inserter(futures), start_async); // join std::vector results; std::transform(futures.begin(), futures.end(), std::back_inserter(results), std::mem_fn(&std::future::get)); // demo output auto print_result = [](const std::string& output) { std::cout << output << std::endl; }; std::for_each(results.cbegin(), results.cend(), print_result); return 0; }