স্ব বর্ণনামূলক।
মূলত, বলুন আমার মতো টাইপ তালিকাগুলি রয়েছে:
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{});
}
}
আমি কেবল এটিই বলব যে এটি সঠিকভাবে পাওয়া কতটা কঠিন তা বিবেচনা করে, ব্যারি কর্তৃক উত্তরের মতো কেবল বুস্ট ব্যবহার করুন। দুর্ভাগ্যক্রমে আমাকে একটি হাত ঘূর্ণিত পদ্ধতির সাথে আটকে থাকতে হবে কারণ বুস্ট ব্যবহার করা বা না করা কোনও সিদ্ধান্ত যা অন্য কোথাও থেকে আসে :(
cartesian_product
ধরণের তালিকাগুলির একটি তালিকা এবং প্রতিটি পুনরাবৃত্তির পদক্ষেপে আপনি প্রতিটি অভ্যন্তরের প্রকারের তালিকায় স্টাফ যুক্ত করতে চান। প্যাকের দ্বিতীয় প্যাকিং স্তরে উঠতে কিছুটা ছাড় নেওয়া লাগে ...