¿Cómo hacer una función que comprima dos tuplas en C ++ 11 (STL)?

Hace poco me encontré con este rompecabezas, finalmente pude encontrar una respuesta intrépida (utilizando matrices de índices) y quise compartirla (respuesta a continuación). Estoy seguro de que hay respuestas que usan recursión de plantillas y respuestas que usanboost; Si está interesado, por favor comparta otras maneras de hacer esto. Creo que tener todo esto en un solo lugar puede beneficiar a otros y ser útil para aprender algunos de los trucos de metaprogramación de plantillas de C ++ 11.

Problema: Dadas dos tuplas de igual longitud:

auto tup1 = std::make_tuple(1, 'b', -10);
auto tup2 = std::make_tuple(2.5, 2, std::string("even strings?!"));

¿Cómo se crea una función que "comprima" las dos tuplas en una tupla heterogénea de pares?

std::tuple<
    std::pair<int, double>,
    std::pair<char, int>,
    std::pair<int, std::string> > result =
    tuple_zip( tup1, tup2 );

Dónde

std::get<0>(result) == std::make_pair(1, 2.5);
std::get<1>(result) == std::make_pair('b', 2);
std::get<2>(result) == std::make_pair(-10, std::string("even strings?!"));

Respuestas a la pregunta(2)

Su respuesta a la pregunta