2017-10-20 85 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