2017-08-03 91 views
15

我有一個關於劃分元組的問題,正如標題所述。如何在C++中劃分元組

事實上,我可以使用std::index_sequence,但代碼看起來很醜。

是否有一個完成此任務的優雅方式?

這裏有一些代碼來展示我的意思。

#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

如果你有一個C++ 17功能的編譯器,你可以使用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