2

我想知道,不使用典型的递归函数,而是使用boost::hana例如,如何以最简单的方式使用以下类型的对象进行转换booststd例如):

std::tuple<int, double, char, double>

到一个类型的对象:

std::tuple<std::pair<int, double>, std::pair<char, double> >;

我正在查看boost::hana文档,但我发现没有比使用递归模板函数手动编程更简单的方法了(我不得不说有一些我无法理解的 hana 函数)。

注意:我最初的想法是创建一个从 0 到 N hana::range(在两个列表上成对运行以创建std::pairs... 这是太多的步骤,并且可以通过手动实现更容易实现;但我确定在 hana 文档中我遗漏了一些东西。

4

1 回答 1

6

没有递归,你可以这样做:

template <typename Tuple, std::size_t... Is>
auto to_tuple_pairs(Tuple&& tuple, std::index_sequence<Is...>)
{
    return make_tuple(std::make_pair(std::get<2 * Is>(tuple), std::get<2 * Is + 1>(tuple))...);
}

template <typename Tuple>
auto to_tuple_pairs(Tuple&& tuple)
{
    return to_tuple_pairs(std::forward<Tuple>(tuple),
                          std::make_index_sequence<std::tuple_size<std::decay_t<Tuple>>::value / 2>());
}

演示

于 2017-10-20T07:41:16.663 回答