Tự giải thích.
Về cơ bản, giả sử tôi có danh sách loại như vậy:
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
Chúng có thể là số lượng của danh sách loại.
Làm thế nào để tôi có được một kiểu chữ của sản phẩm Cartesian?
result = type_list<
type_list<int, somestructB, double>,
type_list<int, somestructB, short>,
type_list<somestructA, somestructB, double>,
type_list<somestructA, somestructB, short>
>;
Tôi đã nghiên cứu cách tạo ra một sản phẩm Cartesian hai chiều như được đưa ra ở đây: Làm thế nào để tạo ra sản phẩm Cartesian của một danh sách loại? , nhưng cách n dường như không quá tầm thường.
Hiện tại tôi đang cố gắng ...
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{});
}
}
Tôi sẽ chỉ nói rằng xem xét mức độ khó để làm cho đúng, chỉ cần sử dụng boost như trong câu trả lời của Barry. Thật không may, tôi phải bị mắc kẹt với một cách tiếp cận bằng tay vì sử dụng boost hay không là một quyết định đến từ một nơi khác :(
cartesian_product
là một danh sách các danh sách loại và tại mỗi bước đệ quy bạn muốn nối các công cụ vào từng danh sách loại bên trong. Bước vào cấp độ đóng gói thứ hai của gói đó sẽ bị trừ đi ...