I came across this syntax while reading up on std::integer_sequence.
What does this double bracket do? It looks like some form of loop. Does it only work with non-type template parameters? Must it be in the same order as the parameters? Can we iterate backwards? Skip a number?
// pretty-print a tuple
template<class Ch, class Tr, class Tuple, std::size_t... Is>
void print_tuple_impl(std::basic_ostream<Ch,Tr>& os,
                      const Tuple& t,
                      std::index_sequence<Is...>)
{
    ((os << (Is == 0? "" : ", ") << std::get<Is>(t)), ...);
}
 
     
    