2016-10-20 2 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

関連する問題