2016-10-20 27 views
6

Czy masz jakieś pojęcie o tym, jak wdrożyć tę funkcję?rozpakuj listę krotek

template <class ... Ts> 
auto unzip(const list<tuple<Ts...>> & l) 
{ 
    ... 
} 

Ta funkcja otrzyma listę krotek i zwróci krotkę list. Pierwsza lista zawiera elementy get<0>(t) i tak dalej.

Potrafię przemierzać elementy krotki i oczywiście przechodzić przez listę. Ale nie wiem, jak zadeklarować niektóre takie wskazówki lub referencje?

Odpowiedz

4

zrobiłbym to tak:

template<typename... Ts, size_t... is> 
auto unzip_impl(list<tuple<Ts...>> const& l, std::index_sequence<is...>) 
{ 
    tuple<list<Ts>...> ret; 
    for(auto const& el : l) { 
     std::initializer_list<int> { 
      (std::get<is>(ret).push_back(std::get<is>(el)), 0)... 
     }; 
    } 
    return ret; 
} 

template <class... Ts> 
auto unzip(const list<tuple<Ts...>> & l) 
{ 
    return unzip_impl(l, std::index_sequence_for<Ts...>{}); 
} 

live demo

również, bardziej C++ 17-y wersja z rozkładana wyrażeń:

template<typename... Ts, size_t... is> 
auto unzip_impl(list<tuple<Ts...>> const& l, std::index_sequence<is...>) 
{ 
    tuple<list<Ts>...> ret; 
    for(auto const& el : l) { 
     (std::get<is>(ret).push_back(std::get<is>(el)),...); 
    } 
    return ret; 
} 

live demo