16 template<
typename... Ts>
17 struct CartesianProductImplHelper;
20 template<
template<
typename...>
class TList,
typename... Ts>
21 struct CartesianProductImplHelper<TList<Ts...>>
23 using type = TList<Ts...>;
27 template<
template<
typename...>
class TList,
typename... Ts>
28 struct CartesianProductImplHelper<TList<TList<>>, Ts...>
34 template<
template<
typename...>
class TList,
typename... Ts,
typename... Rests>
35 struct CartesianProductImplHelper<TList<Ts...>, TList<>, Rests...>
40 template<
template<
typename...>
class TList,
typename... X,
typename H,
typename... Rests>
41 struct CartesianProductImplHelper<TList<X...>, TList<H>, Rests...>
43 using type1 = TList<Concatenate<X, TList<H>>...>;
44 using type =
typename CartesianProductImplHelper<type1, Rests...>::type;
48 template<
typename...>
class TList,
50 template<
typename...>
class Head,
54 struct CartesianProductImplHelper<TList<X...>, Head<T, Ts...>, Rests...>
56 using type1 = TList<Concatenate<X, TList<T>>...>;
57 using type2 =
typename CartesianProductImplHelper<TList<X...>, TList<Ts...>>::type;
59 using type =
typename CartesianProductImplHelper<type3, Rests...>::type;
62 template<
template<
typename...>
class TList,
typename... Ts>
63 struct CartesianProductImpl;
66 template<
template<
typename...>
class TList>
67 struct CartesianProductImpl<TList>
73 template<
template<
typename...>
class TList,
template<
typename...>
class Head,
typename... Ts,
typename... Tail>
74 struct CartesianProductImpl<TList, Head<Ts...>, Tail...>
76 using type =
typename detail::CartesianProductImplHelper<TList<TList<Ts>...>, Tail...>::type;
80 template<
template<
typename...>
class TList,
typename... Ts>