আমি যতদূর বলতে পারি, যদি আপনি উভয় সদস্য রাখতে চান তবে এটি সম্ভব নয়। প্রকারটি একই এবং খালি থাকলে আপনি কেবল বিশেষজ্ঞের একজন সদস্য থাকতে পারেন:
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
আপনাকে পিছনে রেখেছে ...