I know I haven't implemented many methods, and haven't specialized it for T[]
, but I just want to see if what I coded is good or bad.
template< class T >
class unique_ptr
{
private:
T* ptr;
public:
unique_ptr() noexcept : ptr(nullptr) {}
~unique_ptr() noexcept { release(); }
explicit unique_ptr(T* data) noexcept;
unique_ptr(const unique_ptr& rhs) = delete;
unique_ptr& operator=(const unique_ptr& rhs) = delete;
unique_ptr(unique_ptr&& rhs) noexcept;
unique_ptr& operator=(unique_ptr&& rhs) noexcept
{
ptr = std::move(rhs.ptr);
}
T& operator*() { return *get(); }
T* get() const noexcept;
T* release() noexcept;
};
template< class T >
unique_ptr<T>::unique_ptr(T* data) noexcept : ptr(data) {}
template< class T >
unique_ptr<T>::unique_ptr(unique_ptr&& rhs) noexcept
{
ptr = std::move(rhs.ptr);
}
template< class T >
T* unique_ptr<T>::get() const noexcept
{
return ptr;
}
template < class T >
T* unique_ptr<T>::release() noexcept
{
auto old_ptr = ptr;
ptr = nullptr;
return old_ptr;
}
template< typename T, typename ...Args >
unique_ptr<T> make_unique(Args&&... args)
{
return unique_ptr<T>(new T(std::forward<Args>(args)...));
}