将N种类型的参数包折叠成N-1对

nyr*_*ium 3 c++ c++11 c++17

我想的参数包折叠N不同类型成std::tupleN-1 std::pairs具有相应类型.

所以例如表达式

ResolveToTupleOfPairs<void, int, long>::Type tuple;
Run Code Online (Sandbox Code Playgroud)

应该评估

std::tuple<std::pair<void, int>, std::pair<int, long>> tuple;
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找ResolveToTupleOfPairs折叠参数包的类型的实现,如解释的那样.我当前的实现如下,但显然它导致类型是一对对的元组,每个对包含两次相同的类型而不是<T0, T1>, <T1, T2>, ....

template<typename... T>
struct ResolveToTupleOfPairs {
    static_assert(sizeof...(Args) > 1, "need at least two arguments");

    using Type = std::tuple<std::pair<T, T>...>;
};
Run Code Online (Sandbox Code Playgroud)

我很满意c++17解决方案.

Pas*_* By 5

我们利用参数包扩展非常聪明的事实

template<typename...>
struct fold;

template<size_t... Is, typename... Ts>
struct fold<std::index_sequence<Is...>, Ts...>
{
    using tuple = std::tuple<Ts...>;
    using type = std::tuple<std::pair<std::tuple_element_t<Is, tuple>,
                                      std::tuple_element_t<Is + 1, tuple>>...>;
};

template<typename... Ts>
using fold_t = typename fold<std::make_index_sequence<sizeof...(Ts) - 1>, Ts...>::type;
Run Code Online (Sandbox Code Playgroud)

生活