2013-07-27 3 views

ответ

20

Скопировано из make_unique and perfect forwarding (то же, что и в Herb Sutter's blog)

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

Если вам это нужно VC2012 см Is there a way to write make_unique() in VS2012?


Тем не менее, если решение в sasha.sochka's answer компилируется компилятором, я бы с этим один. Это более тщательно и работает с массивами.

36

Версия Стефан Т. Lavavej (известный также STL), который изначально предложил добавить эту функцию в 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; 
} 

C++ EDIT: обновленный код для N3656 стандартного пересмотра

+0

Как связывает структура '_Known_bound', когда не используется' _Unique_if 'задает второй аргумент шаблона и нет значения по умолчанию? –

+2

@BenJackson Цель состоит в том, чтобы никогда не быть совпадением для версии '_Known_bound', когда' make_unique' используется правильно. Если кто-то пытается использовать его как 'make_unique ()', он будет соответствовать версии '_Known_bound' и приведет к ошибке. – Praetorian

+2

Каким образом можно включить это определение в код на C++, который может быть скомпилирован в среде, где make_unique доступен в stdC++? –

Смежные вопросы