如何在C++中划分元组

Wan*_*Chu 15 c++ tuples c++11

正如标题所说,我有一个关于划分元组的问题.

事实上,我可以使用它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;
}
Run Code Online (Sandbox Code Playgroud)

eca*_*mur 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);
Run Code Online (Sandbox Code Playgroud)

例子.

由于您使用的是VS2015.2,它支持C++ 14和后来的草案n4567,因此您在可用的库支持方面受到相当的限制.但是,您可以使用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);
Run Code Online (Sandbox Code Playgroud)

例子.