Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to implement make_unique function in C++11? [duplicate]

My compiler doesn't support make_unique. How to write one?

template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ); 
like image 843
user1899020 Avatar asked Jul 27 '13 20:07

user1899020


People also ask

Can you copy a unique_ ptr?

A unique_ptr does not share its pointer. It cannot be copied to another unique_ptr , passed by value to a function, or used in any C++ Standard Library algorithm that requires copies to be made. A unique_ptr can only be moved.

Does Make_unique initialize memory?

Yes, all the elements will be value initialized by std::make_unique.

How does unique_ ptr work?

A unique_ptr object wraps around a raw pointer and its responsible for its lifetime. When this object is destructed then in its destructor it deletes the associated raw pointer. unique_ptr has its -> and * operator overloaded, so it can be used similar to normal pointer.

Does Make_unique throw?

A little late, but make_unique can itself throw according to cppreference: make_unique "may throw std::bad_alloc or any exception thrown by the constructor of T. If an exception is thrown, this function has no effect." So how is that exception safe?


1 Answers

Version by Stephan T. Lavavej (also known by STL) who originally proposed adding this function to C++14

#include <cstddef> #include <memory> #include <type_traits> #include <utility>  namespace std {     template<class T> struct _Unique_if {         typedef unique_ptr<T> _Single_object;     };      template<class T> struct _Unique_if<T[]> {         typedef unique_ptr<T[]> _Unknown_bound;     };      template<class T, size_t N> struct _Unique_if<T[N]> {         typedef void _Known_bound;     };      template<class T, class... Args>         typename _Unique_if<T>::_Single_object         make_unique(Args&&... args) {             return unique_ptr<T>(new T(std::forward<Args>(args)...));         }      template<class T>         typename _Unique_if<T>::_Unknown_bound         make_unique(size_t n) {             typedef typename remove_extent<T>::type U;             return unique_ptr<T>(new U[n]());         }      template<class T, class... Args>         typename _Unique_if<T>::_Known_bound         make_unique(Args&&...) = delete; } 

EDIT: updated code to the N3656 standard revision

like image 142
sasha.sochka Avatar answered Nov 08 '22 04:11

sasha.sochka