Как создать функцию, которая сжимает два кортежа в C++11 (STL )?

Недавно я столкнулся с этой головоломкой, наконец-то смог найти хакерский ответ (с использованием массивов индексов )и хотел поделиться этим (ответом ниже ). Я уверен, что есть ответы, использующие рекурсию шаблонов, и ответы, использующие boost; если вам интересно, пожалуйста, поделитесь другими способами сделать это. Я думаю, что наличие всего этого в одном месте может принести пользу другим и будет полезно для изучения некоторых крутых приемов метапрограммирования шаблонов C++11.

Задача: Даны два кортежа одинаковой длины:

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

Как создать функцию, которая «склеит» два кортежа в неоднородный кортеж пар?

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

Где

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?!"));
17
задан user 4 July 2012 в 03:32
поделиться