อธิบายตนเอง
โดยพื้นฐานแล้วฉันมีรายการประเภทดังนี้:
using type_list_1 = type_list<int, somestructA>;
using type_list_2 = type_list<somestructB>;
using type_list_3 = type_list<double, short>;
พวกเขาสามารถเป็นจำนวนชนิดรายการ
ฉันจะพิมพ์ดีดของผลิตภัณฑ์คาร์ทีเซียนได้อย่างไร
result = type_list<
type_list<int, somestructB, double>,
type_list<int, somestructB, short>,
type_list<somestructA, somestructB, double>,
type_list<somestructA, somestructB, short>
>;
ฉันตะลุยวิธีการสร้างผลิตภัณฑ์คาร์ทีเซียนแบบสองทางตามที่กำหนดไว้ที่นี่: วิธีสร้างผลิตภัณฑ์คาร์ทีเซียนของรายการประเภท แต่ดูเหมือนไม่มีทางน่ารำคาญเลย
ตอนนี้ฉันกำลังพยายาม ...
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{});
}
}
ฉันจะบอกว่าการพิจารณาว่ามันยากแค่ไหนที่จะทำให้ถูกต้องให้ใช้การกระตุ้นเหมือนคำตอบของ Barry น่าเสียดายที่ฉันต้องติดอยู่กับวิธีการรีดด้วยมือเพราะใช้การเพิ่มหรือไม่เป็นการตัดสินใจที่มาจากที่อื่น :(
cartesian_product
รายการลิสต์ประเภทและในแต่ละขั้นตอนการเรียกซ้ำคุณต้องการผนวกข้อมูลเข้ากับลิสต์แต่ละประเภทภายใน การเข้าสู่ระดับการบรรจุหีบห่อที่สองนั้นจะลดหย่อน ...