2016-10-20 4 views
6

이 기능을 구현하는 방법에 대한 아이디어가 있으십니까?튜플 목록의 압축을 풉니 다

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

이 기능은 튜플의 목록을받을 및 목록의 튜플을 반환합니다. 첫 번째 목록에는 get<0>(t) 등의 요소가 포함됩니다.

튜플의 항목을 탐색 할 수 있고 물론 목록을 탐색 할 수 있습니다. 하지만 어떻게 그런 말을해야할지 모르겠다. tuple<list<T1>, list<T2> ...>

실마리 나 참조 사항이 있으십니까?

답변

4

나는 이런 식으로 할 거라고 : 접이식 표현과

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

, 더 C++ 17-Y 버전 :

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