Come implementare la funzione make_unique in C ++ 11?

Il mio compilatore non supporta make_unique. Come scriverne uno?

template unique_ptr make_unique( Args&&... args ); 

Copiato da make_unique e perfetto inoltro (lo stesso è dato nel blog di Herb Sutter )

 template std::unique_ptr make_unique(Args&&... args) { return std::unique_ptr(new T(std::forward(args)...)); } 

Se ti serve in VC2012, vedi C’è un modo per scrivere make_unique () in VS2012?


Ciononostante, se la soluzione nella risposta di sasha.sochka viene compilata con il compilatore, andrei con quella. Questo è più elaborato e funziona anche con gli array.

Versione di Stephan T. Lavavej (noto anche da STL) che originariamente aveva proposto di aggiungere questa funzione a C ++ 14

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

EDIT: codice aggiornato per la revisione standard N3656