template void parallel_for_each(Iterator first, Iterator last, Func f) { unsigned long const length = std::distance(first, last); if (!length) return; unsigned long const min_per_thread = 25; if (length < (2 * min_per_thread)) { std::for_each(first, last, f); } else { Iterator const mid_point = first + length / 2; std::future first_half = std::async(¶llel_for_each, first, mid_point, f); parallel_for_each(mid_point, last, f); first_half.get(); } }