2017-08-03 23 views
15

タプルを分割することについての質問は、タイトルのとおりです。C++でタプルを分割する方法

実際、std::index_sequenceを使用してコードを作成できますが、コードは醜いです。

これを達成するためのエレガントな方法はありますか?

ここに、私が意味するものを示すいくつかのコードがあります。あなたがC++ 17対応のコンパイラを使用している場合

#include<tuple> 
using namespace std; 

template<typename THead, typename ...TTails> 
void foo(tuple<THead, TTails...> tpl) 
{ 
    tuple<THead> tpl_h { get<0>(tpl) }; 
    tuple<TTails...> tpl_t { /* an elegent way? */ } 
    do_sth(tpl_h, tpl_t); 
} 

int main() 
{ 
    foo(make_tuple(1, 2.0f, 'c')); 
    return 0; 
} 
+1

似たような質問が以前に尋ねられました:https://stackoverflow.com/questions/8569567/get-part-of-stdtupleしかし、ecatmurによるC + 17の回答はもっと短く見えます。 – Swift

+0

@Swiftありがとう、私は行くと見ていきます。 – WangChu

答えて

8

、あなたはapplyを使用することができます。

auto [tpl_h, tpl_t] = apply([](auto h, auto... t) { 
    return pair{tuple{h}, tuple{t...}}; 
}, tpl); 
do_sth(tpl_h, tpl_t); 

Exampleを。

C++ 14およびそれ以降の暫定n4567をサポートするVS2015.2を使用しているため、利用可能なライブラリのサポートはかなり制限されています。ただし、piecewise_constructを使用することができます。

struct unpacker { 
    tuple<THead> tpl_h; 
    tuple<TTails...> tpl_t; 
    unpacker(THead h, TTails... t) : tpl_h{h}, tpl_t{t...} {} 
}; 
auto unpacked = pair<unpacker, int>{piecewise_construct, tpl, tie()}.first; 
do_sth(unpacked.tpl_h, unpacked.tpl_t); 

Example

+0

ありがとうございます。しかし私はVS2015.2(サポートC + + 14)を使用しています。コンパイラを置き換えずに使用できる方法はありますか? – WangChu

+0

@WangChu: 'apply'はC++ 14で実装できます。 – Jarod42

+0

@ Jarod42さて、私は試してみる。 – WangChu

関連する問題