Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- template <typename T, std::size_t I, bool = std::is_empty_v<T> && !std::is_final_v<T>>
- struct CompressedPairElement {
- CompressedPairElement(){}
- CompressedPairElement(T v) : value(std::forward<T>(v)) {
- }
- const auto Get() const {
- return value;
- }
- auto Get() {
- return value;
- }
- T value;
- };
- template <typename T, std::size_t I>
- struct CompressedPairElement<T, I, true> : T {
- CompressedPairElement() {
- }
- CompressedPairElement<T, I, true>(const T& v) {
- }
- CompressedPairElement<T, I, true>(T&& v) {
- }
- const T& Get() const {
- return static_cast<const T&>(this);
- }
- T& Get() {
- return static_cast<T&>(this);
- }
- };
- template <typename F, typename S>
- class CompressedPair : CompressedPairElement<F, 1>, CompressedPairElement<S, 2> {
- public:
- CompressedPair(F first, S second):CompressedPairElement<F, 1>(std::forward<F>(first)),
- CompressedPairElement<S, 2>(std::forward<S>(second)){}
- const F& GetFirst() const {
- return CompressedPairElement<F, 1>::Get();
- }
- F& GetFirst() {
- return CompressedPairElement<F, 1>::Get();
- }
- const S& GetSecond() const {
- return CompressedPairElement<S, 2>::Get();
- }
- S& GetSecond() {
- return CompressedPairElement<S, 2>::Get();
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement