如何根据sizt_t...Ints的模板参数包构造class模板的元组类型?

How to construct tuple types of class template based on template parameter pack of sizt_t... Ints?

在c++17的上下文中,如何构造以下元组类型(TypeMaker如何实现)?

template <size_t M, size_t N>
class A {
  // ...
}

template <size_t M>
class B {
 // ...
}

template <size_t... Ints>
struct TypeMaker {
 // here is the question
 // using typeA = ...
 // using typeB = ...
}

typeA 和 typeB 是这样的:

typename TypeMaker<3, 5, 2, 10>::typeA  
-----> std::tuple<A<3, 5>, A<5, 2>, A<2, 10>>

typename TypeMaker<3, 5, 2, 10>::typeB
-----> std::tuple<B<5>, B<2>, B<10>> // drop first int 3

// sizeof...(Ints) has to be larger than 1 to have valid typeB

我正在寻找通用类型生成器,因此相同的代码将适用于不同的数字,例如:

TypeMaker<1, 2>, TypeMaker<3, 5, 3>, TypeMaker<1, 3, 9, 3, 10, 88, 128> ....

我觉得这可以递归完成,但不确定如何。

大概是这样的:

template <size_t... Ints>
struct TypeMaker {
private:
  using Numbers = std::tuple<std::integral_constant<size_t, Ints>...>;
  template <size_t N>
  static constexpr size_t Number = std::tuple_element_t<N, Numbers>::value;

  template <size_t... Indexes>
  static std::tuple<A<Number<Indexes>, Number<Indexes + 1>>...>
  MakeA(std::index_sequence<Indexes...>);

  template <size_t... Indexes>
  static std::tuple<B<Number<Indexes + 1>>...>
  MakeB(std::index_sequence<Indexes...>);

public:
  using typeA = decltype(MakeA(std::make_index_sequence<sizeof...(Ints)-1>()));
  using typeB = decltype(MakeB(std::make_index_sequence<sizeof...(Ints)-1>()));
};

Demo