स्वयं व्याख्यात्मक।
मूल रूप से, कहो तो मेरे पास टाइप सूचियाँ हैं:
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>
>;
मैंने दो-तरफा कार्टेसियन उत्पाद बनाने के तरीके के बारे में बताया है: यहां एक प्रकार की सूची का कार्टेशियन उत्पाद कैसे बनाया जाता है? , लेकिन n तरीका इतना तुच्छ नहीं लगता है।
अभी के लिए मैं कोशिश कर रहा हूँ ...
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{});
}
}
मैं सिर्फ इतना कहूंगा कि इसे ठीक करना कितना मुश्किल है, इस पर विचार करते हुए बैरी के जवाब में सिर्फ बूस्ट का उपयोग करें। दुर्भाग्य से मुझे हाथ से लुढ़कने वाले दृष्टिकोण के साथ फंसना पड़ता है क्योंकि बूस्ट का उपयोग करना या न करना एक निर्णय है जो कहीं और से आता है :(
cartesian_product
टाइप सूचियों की एक सूची है, और प्रत्येक पुनरावर्तन कदम पर आप प्रत्येक आंतरिक प्रकार की सूची में सामान जोड़ना चाहते हैं। पैक के उस दूसरे पैकिंग स्तर में आने से कुछ कटौती होती है ...