make_unique.h
1 /*
2  * make_unique.h
3  *
4  * Created on: 22 mars 2016
5  * Author: thomas
6  */
7 
8 #ifndef GIGA_UTILS_MAKE_UNIQUE_H_
9 #define GIGA_UTILS_MAKE_UNIQUE_H_
10 
11 #include <cstddef>
12 #include <memory>
13 #include <type_traits>
14 #include <utility>
15 
16 namespace giga {
17  template<class T> struct _Unique_if {
18  typedef std::unique_ptr<T> _Single_object;
19  };
20 
21  template<class T> struct _Unique_if<T[]> {
22  typedef std::unique_ptr<T[]> _Unknown_bound;
23  };
24 
25  template<class T, size_t N> struct _Unique_if<T[N]> {
26  typedef void _Known_bound;
27  };
28 
29  template<class T, class... Args>
30  typename _Unique_if<T>::_Single_object
31  make_unique(Args&&... args) {
32  return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
33  }
34 
35  template<class T>
36  typename _Unique_if<T>::_Unknown_bound
37  make_unique(size_t n) {
38  typedef typename std::remove_extent<T>::type U;
39  return std::unique_ptr<T>(new U[n]());
40  }
41 
42  template<class T, class... Args>
43  typename _Unique_if<T>::_Known_bound
44  make_unique(Args&&...) = delete;
45 }
46 
47 
48 #endif /* GIGA_UTILS_MAKE_UNIQUE_H_ */
Definition: make_unique.h:17