2017-10-20 11 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再帰的なテンプレート関数(私が理解できなかった花の関数があると言わなければならない)。

注:私は考えていたものは、最初は、その後も、オッズインデックスの二つのグループでそれらをフィルタリングし、0からNまでの整数の範囲(hana::range)を作成することでした、となって、インデックスの各グループについて、対応する値を設定し、両方のリストに対して関数を適用してstd::pair ...を作成します。これはあまりにも多くのステップであり、手作業で簡単に実装できます。私は花の資料に欠けているものがあると確信しています。再帰なし

+0

私は受け入れ答えは、それを行うための最善の方法だと思います。 'hana :: range'と' hana :: unpack'を使って、少し見栄えを良くすることができますが、基本的に同じです。 –

+0

@LouisDionne私はさまざまな方法で試しました。最短の方法は、 '' hana :: range'を作成し、奇数と偶数のインデックスのパーティションを作成し、 '' hana :: unpack''と '' hana :: zip_with''をペアを作成するファンクタ。他の解決策は、0からN/2の範囲を作成し、それぞれに対応する '* 2'と' * 2 + 1'演算を行う 'hana :: chain'または' 'hana :: transform'を作成し、各インデックスシーケンスについて2回スライスする。あまりにも多くの痛み...;古いスタイルはまだまだ短くなっています。 –

+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

関連する問題