14 #ifndef ROOT_RMakeUnique
15 #define ROOT_RMakeUnique
19 #if __cplusplus < 201402L && !defined(_MSC_VER)
21 #include <type_traits>
28 struct RMakeUniqueResult {
29 using scalar = std::unique_ptr<T>;
32 struct RMakeUniqueResult<T[]> {
33 using array = std::unique_ptr<T[]>;
35 template <
typename T,
size_t N>
36 struct RMakeUniqueResult<T[N]> {
45 template <
typename T,
typename... Args>
46 typename ROOT::Detail::RMakeUniqueResult<T>::scalar make_unique(Args &&... args)
48 return std::unique_ptr<T>(
new T(std::forward<Args>(args)...));
52 typename ROOT::Detail::RMakeUniqueResult<T>::array make_unique(std::size_t size)
54 return std::unique_ptr<T>(
new typename std::remove_extent<T>::type[size]());
57 template <
typename T,
typename... Args>
58 typename ROOT::Detail::RMakeUniqueResult<T>::invalid make_unique(Args &&...) =
delete;