我有一个关于划分元组的问题,正如标题所说。
事实上,我可以使用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;
}
答案 0 :(得分: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);
由于您使用的是支持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);