c++ - 从 N 个元素的元组到 N/2 对的元组

标签 c++ boost c++14 boost-hana

我想知道,不使用典型的递归函数,而是使用 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 文档中遗漏了某些内容。

最佳答案

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

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>());
}

Demo

关于c++ - 从 N 个元素的元组到 N/2 对的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46842908/

相关文章:

c++ - 捕获嵌套模板异常 [C++]

c++ - Mac High Sierra 上 C++ 中的段错误 11

c++ - 为什么删除了复制构造函数的结构不是 POD 类型?

c++ - 将参数传递给采用父类参数的函数,而不将参数强制转换为父类

c++ - Boost Asio HTTPS 请求给出 'certificate verify failed' 错误

c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?

c++ - return 语句中的统一初始化以及将运算符显式转换为 bool

c++ - 如何安全地删除析构函数中的线程指针?

c++ - 在 C++ 的命名空间中包含全局函数

c++ - 如何使用 boost 程序选项获取默认参数值?