2017-08-03 92 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