2017-10-20 99 views
2

我想知道,不使用典型的递归函数,但使用boost::hana为例,如何用最简单的方式转换工具booststd工具的一个对象以下类型(例如):从N元素的元组到N/2对的元组

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

到类型的对象:

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

我一直在寻找的boost::hana文档中,但我没有发现任何简单的方法来做到这一点不是编程它手动机智h递归模板函数(我必须说有hana的功能我无法理解)。

注:我脑子里想的是什么最初是从0创建一个整数范围为N(hana::range),然后过滤他们甚至两组赔率指数,以及获得,每个索引组,相应的值并在两个列表中成对应用以创建std::pair s ...这些步骤太多并且可以通过手动实现更容易实现;但我确定在hana文档中有一些我错过的东西。

+0

我想接受的答案是做到这一点的最好办法。你可以使用'hana :: range'和'hana :: unpack'来使这个看起来更好看一些,但它本质上是一样的。 –

+0

@LouisDionne我尝试过不同的方法,最简单的方法是:创建一个'hana :: range',为奇数和偶数索引创建一个分区,然后使用'hana :: unpack'和'hana :: zip_with'一个创建对的函子。其他解决方案是创建一个从0到N/2的范围,然后使用'hana :: chain'或'hana :: transform'来对每个进行相应的* 2和* 2 + 1操作,切片“每个索引序列两次。太痛苦了......;旧样式仍然较短。 –

+0

下面是我的意思:https://wandbox.org/permlink/nLG7RC7ieZzK5io4。就像我所说的那样,它更像哈娜式的,但它本质上与公认的答案相同。 –

回答

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

Demo

+0

我认为你需要在上面的函数中将'Is'与2相乘来创建正确的对。 – Banan

+0

@Banan:的确,固定的。 – Jarod42