Kendini açıklayıcı.
Temelde, şöyle listeleri var diyelim:
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
Değişken sayıda tip listesi olabilir.
Kartezyen bir ürün listesi nasıl alabilirim?
result = type_list<
type_list<int, somestructB, double>,
type_list<int, somestructB, short>,
type_list<somestructA, somestructB, double>,
type_list<somestructA, somestructB, short>
>;
Burada verildiği gibi, iki yönlü bir Kartezyen ürününün nasıl oluşturulacağı konusunda bir fikrim var: Bir tür listesinin Kartezyen ürünü nasıl oluşturulur? , ama hiçbir şekilde önemsiz görünmüyor.
Şimdilik çalışıyorum ...
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{});
}
}
Sadece doğru yapmanın ne kadar zor olduğunu göz önünde bulundurarak, Barry'nin cevabındaki gibi destek kullanın. Ne yazık ki, el haddelenmiş bir yaklaşımla sıkışmış olmalıyım çünkü takviye kullanmak ya da kullanmamak başka bir yerden gelen bir karardır :(
cartesian_product
, tür listelerinin bir listesidir ve her özyineleme adımında, her iç tür listesine bir şeyler eklemek istersiniz. Paketin ikinci ambalaj seviyesine girmek biraz kesinti gerektiriyor ...