जहां तक मैं बता सकता हूं, यदि आप दोनों सदस्य चाहते हैं तो यह संभव नहीं है। लेकिन आप विशेषज्ञ और प्रकार के एक ही और खाली होने पर केवल एक सदस्य हो सकते हैं:
template <typename T, typename S, typename = void>
struct Empty{
[[no_unique_address]] T t;
[[no_unique_address]] S s;
constexpr T& get_t() noexcept { return t; };
constexpr S& get_s() noexcept { return s; };
};
template<typename TS>
struct Empty<TS, TS, typename std::enable_if_t<std::is_empty_v<TS>>>{
[[no_unique_address]] TS ts;
constexpr TS& get_t() noexcept { return ts; };
constexpr TS& get_s() noexcept { return ts; };
};
बेशक, बाकी प्रोग्राम जो सदस्यों का उपयोग करते हैं, उन्हें उस मामले से निपटने के लिए बदलना होगा जहां केवल एक सदस्य है। इससे कोई फर्क नहीं पड़ता कि इस मामले में किस सदस्य का उपयोग किया गया है - आखिरकार, यह एक अद्वितीय वस्तु है जिसमें कोई अद्वितीय पता नहीं है। दिखाए गए सदस्य फ़ंक्शन को सरल बनाना चाहिए।
दुर्भाग्य से sizeof(Empty<Empty<A,A>,A>{})==2
जहां ए पूरी तरह से खाली संरचना है।
खाली जोड़े के पुनरावर्ती संपीड़न का समर्थन करने के लिए आप और अधिक विशेषज्ञता ला सकते हैं:
template<class TS>
struct Empty<Empty<TS, TS>, TS, typename std::enable_if_t<std::is_empty_v<TS>>>{
[[no_unique_address]] Empty<TS, TS> ts;
constexpr Empty<TS, TS>& get_t() noexcept { return ts; };
constexpr TS& get_s() noexcept { return ts.get_s(); };
};
template<class TS>
struct Empty<TS, Empty<TS, TS>, typename std::enable_if_t<std::is_empty_v<TS>>>{
[[no_unique_address]] Empty<TS, TS> ts;
constexpr TS& get_t() noexcept { return ts.get_t(); };
constexpr Empty<TS, TS>& get_s() noexcept { return ts; };
};
और भी, जैसे कुछ सेक करने के लिए Empty<Empty<A, char>, A>
।
template <typename T, typename S>
struct Empty<Empty<T, S>, S, typename std::enable_if_t<std::is_empty_v<S>>>{
[[no_unique_address]] Empty<T, S> ts;
constexpr Empty<T, S>& get_t() noexcept { return ts; };
constexpr S& get_s() noexcept { return ts.get_s(); };
};
template <typename T, typename S>
struct Empty<Empty<S, T>, S, typename std::enable_if_t<std::is_empty_v<S>>>{
[[no_unique_address]] Empty<S, T> st;
constexpr Empty<S, T>& get_t() noexcept { return st; };
constexpr S& get_s() noexcept { return st.get_t(); };
};
template <typename T, typename S>
struct Empty<T, Empty<T, S>, typename std::enable_if_t<std::is_empty_v<T>>>{
[[no_unique_address]] Empty<T, S> ts;
constexpr T& get_t() noexcept { return ts.get_t(); };
constexpr Empty<T, S> get_s() noexcept { return ts; };
};
template <typename T, typename S>
struct Empty<T, Empty<S, T>, typename std::enable_if_t<std::is_empty_v<T>>>{
[[no_unique_address]] Empty<S, T> st;
constexpr T& get_t() noexcept { return st.get_s(); };
constexpr Empty<S, T> get_s() noexcept { return st; };
};
T
खुद के लिए टेम्पलेट तर्क जोड़ने के बारे में क्या ? यह विशिष्ट प्रकार उत्पन्न करेगा। अभी तथ्य यह है कि दोनोंWrapper
से विरासत मेंT
आप को वापस पकड़ रहा है ...