¿Cómo hago un bucle en pares consecutivos en un contenedor STL utilizando la sintaxis de bucle basada en rango?

¿Cómo creo una clase personalizada para repasar pares consecutivos de elementos en un contenedor STL utilizando un bucle basado en rango?

Esta es la sintaxis y salida que quiero:

std::list<int> number_list;
number_list.push_back(1);
number_list.push_back(2);
number_list.push_back(3);

auto paired_list = Paired(number_list);
for (const auto & pair : paired_list) {
  std::printf("The pair is (%d, %d)\n", *(pair[0]), *(pair[1]));
  // or
  //std::printf("The pair is (%d, %d)\n", *(pair.first), *(pair.second));
}
// output:
// The pair is (1, 2)
// The pair is (2, 3)

Sé que se necesitan (y más), pero no puedo entenderlo:

template <class T>
class Paired {
  ???
  class iterator {
    ???
  }
  iterator begin() {
    ...
  }
  iterator end() {
    ...
  }
}

No te preocupes porconst modificadores

No hay impulso.

No modifique ni copie objetos en el contenedor.

Respuestas a la pregunta(4)

Su respuesta a la pregunta