template T parallel_accumulate(Iterator first,Iterator last,T init) { unsigned long const length=std::distance(first,last); unsigned long const max_chunk_size=25; if(length<=max_chunk_size) { return std::accumulate(first,last,init); } else { Iterator mid_point=first; std::advance(mid_point,length/2); std::future first_half_result= std::async(parallel_accumulate, first,mid_point,init); T second_half_result=parallel_accumulate(mid_point,last,T()); return first_half_result.get()+second_half_result; } }