【发布时间】:2017-10-20 05:35:05
【问题描述】:
我想知道,不使用典型的递归函数,而是使用例如boost::hana,如何使用boost 和std 工具以最简单的方式转换以下类型的对象(例如):
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::range和hana::unpack来让这个看起来更好看一点,但基本上是一样的。 -
@LouisDionne 我尝试过不同的方法,最短的方法是:创建一个
hana::range,为奇偶索引创建一个分区,然后使用仿函数hana::unpack和hana::zip_with创建对。其他解决方案是创建一个从 0 到 N/2 的范围,然后hana::chain或hana::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