如何根据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>()));
};
在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>()));
};