解压缩元组列表

时间:2016-10-20 10:18:35

标签: c++ c++11 template-meta-programming

有关如何实现此功能的任何想法吗?

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

此函数将接收元组列表并返回列表元组。第一个列表将包含get<0>(t)的元素,依此类推。

我可以遍历元组的项目,当然也可以遍历列表。但我不知道如何声明一些这样的tuple<list<T1>, list<T2> ...>

任何线索或参考?

1 个答案:

答案 0 :(得分: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

另外,更多带有fold-expressions的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