我想的参数包折叠N不同类型成std::tuple的N-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解决方案.
我们利用参数包扩展非常聪明的事实
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)