【问题标题】:From tuple of N elements to tuple of N/2 pairs从 N 个元素的元组到 N/2 对的元组
【发布时间】:2017-10-20 05:35:05
【问题描述】:

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

【问题讨论】:

  • 我认为接受的答案是最好的方法。你可以使用hana::rangehana::unpack 来让这个看起来更好看一点,但基本上是一样的。
  • @LouisDionne 我尝试过不同的方法,最短的方法是:创建一个hana::range,为奇偶索引创建一个分区,然后使用仿函数hana::unpackhana::zip_with创建对。其他解决方案是创建一个从 0 到 N/2 的范围,然后 hana::chainhana::transform 分别对每个索引序列进行相应的 *2*2+1 操作,并且 slice 对每个索引序列进行两次。太痛苦了……;旧样式仍然更短。
  • 这就是我的意思:wandbox.org/permlink/nLG7RC7ieZzK5io4。就像我说的那样,它更像是 Hana-esque,但在其他方面与公认的答案基本相同。
  • @LouisDionne 是的,我终于找到了类似的方法,但是当这里的每个表达式都是常量时,不能简单地执行hana::make_range(0, hana::size(tuple) / 2) 非常麻烦。

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


【解决方案1】:

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

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

【讨论】:

  • 我认为您需要在上层函数中将Is 与 2 相乘才能创建正确的对。
  • @Banan:确实,已修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多