Selbsterklärend.
Angenommen, ich habe Typlisten wie folgt:
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
Sie können eine variable Anzahl von Typlisten sein.
Wie erhalte ich eine Typeliste für kartesische Produkte?
result = type_list<
type_list<int, somestructB, double>,
type_list<int, somestructB, short>,
type_list<somestructA, somestructB, double>,
type_list<somestructA, somestructB, short>
>;
Ich habe versucht, ein kartesisches Zwei-Wege-Produkt zu erstellen, wie hier angegeben: Wie erstelle ich das kartesische Produkt einer Typenliste? , aber n Weg scheint nicht so trivial zu sein.
Im Moment versuche ich ...
template <typename...> struct type_list{};
// To concatenate
template <typename... Ts, typename... Us>
constexpr auto operator|(type_list<Ts...>, type_list<Us...>) {
return type_list{Ts{}..., Us{}...};
}
template <typename T, typename... Ts, typename... Us>
constexpr auto cross_product_two(type_list<T, Ts...>, type_list<Us...>) {
return (type_list<type_list<T,Us>...>{} | ... | type_list<type_list<Ts, Us>...>{});
}
template <typename T, typename U, typename... Ts>
constexpr auto cross_product_impl() {
if constexpr(sizeof...(Ts) >0) {
return cross_product_impl<decltype(cross_product_two(T{}, U{})), Ts...>();
} else {
return cross_product_two(T{}, U{});
}
}
Ich werde nur sagen, wenn man bedenkt, wie schwierig es ist, es richtig zu machen, benutze einfach Boost wie in der Antwort von Barry. Leider muss ich mich an einen handgerollten Ansatz halten, denn Boost zu verwenden oder nicht, ist eine Entscheidung, die von irgendwo anders kommt :(
cartesian_product
es sich um eine Liste von Typlisten handelt und dass Sie bei jedem Rekursionsschritt Inhalte an jede innere Typliste anhängen möchten. Der Einstieg in diese zweite Packstufe erfordert einen gewissen Abzug ...