c++ новая функция 11 (10) shared_ptr three "создать счетчик"

1. Создайте класс счетчика _Ref_count

новое в конструкторе

template <class _Ux,
    enable_if_t<conjunction_v<conditional_t<is_array_v<_Ty>, _Can_array_delete<_Ux>, _Can_scalar_delete<_Ux>>,    _SP_convertible<_Ux, _Ty>>,   int> = 0>
explicit shared_ptr(_Ux* _Px) {
    
     // construct shared_ptr object that owns _Px
    if constexpr (is_array_v<_Ty>) {
    
    
        _Setpd(_Px, default_delete<_Ux[]>{
    
    });
    } else {
    
    
        _Temporary_owner<_Ux> _Owner(_Px);
        _Set_ptr_rep_and_enable_shared(_Owner._Ptr, new _Ref_count<_Ux>(_Owner._Ptr));
        _Owner._Ptr = nullptr;
    }
}

1.1 Класс _Ref_count

// CLASS TEMPLATE _Ref_count
template <class _Ty>
class _Ref_count : public _Ref_count_base {
    
     // handle reference counting for pointer without deleter
public:
    explicit _Ref_count(_Ty* _Px) : _Ref_count_base(), _Ptr(_Px) {
    
    }

private:
    virtual void _Destroy() noexcept override {
    
     // destroy managed resource
        delete _Ptr;
    }

    virtual void _Delete_this() noexcept override {
    
     // destroy self
        delete this;
    }

    _Ty* _Ptr;
};


// CLASS TEMPLATE shared_ptr
template <class _Ux>
struct _Temporary_owner {
    
    
    _Ux* _Ptr;

    explicit _Temporary_owner(_Ux* const _Ptr_) noexcept : _Ptr(_Ptr_) {
    
    }
    _Temporary_owner(const _Temporary_owner&) = delete;
    _Temporary_owner& operator=(const _Temporary_owner&) = delete;
    ~_Temporary_owner() {
    
    
        delete _Ptr;
    }
};

1.2 _SP_конвертируемый

// TYPE TRAIT _SP_convertible
template <class _Yty, class _Ty> struct _SP_convertible : is_convertible<_Yty*, _Ty*>::type {
    
    };

template <class _Yty, class _Uty> 
     struct _SP_convertible<_Yty, _Uty[]> : is_convertible<_Yty (*)[], _Uty (*)[]>::type {
    
    };
     
template <class _Yty, class _Uty, size_t _Ext> struct _SP_convertible<_Yty, _Uty[_Ext]> : is_convertible<_Yty (*)[_Ext], _Uty (*)[_Ext]>::type {
    
    };

is_convertible — это функция, поддерживаемая внутренне компилятором, которая может узнать, возможно ли преобразование между двумя классами.

Supongo que te gusta

Origin blog.csdn.net/thefist11cc/article/details/123910550
Recomendado
Clasificación