2012-04-14 2 views
11

최대 후속 this 게시물로 나는 make_unique의 구현이 다음 코드와 같은 함수 임시 버퍼 배열 할당과 관련하여 어떻게 작동하는지 궁금합니다. C++ 배열 및 make_unique

f() 
{ 
    auto buf = new int[n]; // temporary buffer 
    // use buf ... 
    delete [] buf; 
} 

이는 make_unique 일부 호출로 대체 할 수 및 삭제의 [] -version는 사용됩니까?

답변

16

은 (마이크 외에) 다른 솔루션입니다

  1. 새로운 T [N] n T를 디폴트로 구성해야합니다.

그래서 make_unique (n)는 nT를 기본으로 설정해야합니다.

  1. 이와 비슷한 문제가 C++ 11에서 제안되지 않은 make_unique에 기여했습니다. 또 다른 문제는 다음과 같습니다. 사용자 정의 삭제자를 처리합니까?

이러한 질문에 답할 수 없습니다. 그러나 그들은 아직 완전히 대답되지 않은 질문들입니다.

+0

...하지만이 질문은 (부분적으로) C++ 14에서 응답되었으며 make_unique는 이제 더 풍부 해졌습니다 (http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique). – einpoklum

+0

@einpoklum : 맞음. Q/A의 날짜를 적어 두십시오. –

4

내가이 코드 작업있어 :

#include <type_traits> 
#include <utility> 
#include <memory> 

template <class T, class ...Args> 
typename std::enable_if 
< 
    !std::is_array<T>::value, 
    std::unique_ptr<T> 
>::type 
make_unique(Args&& ...args) 
{ 
    return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 
} 

template <class T> 
typename std::enable_if 
< 
    std::is_array<T>::value, 
    std::unique_ptr<T> 
>::type 
make_unique(std::size_t n) 
{ 
    typedef typename std::remove_extent<T>::type RT; 
    return std::unique_ptr<T>(new RT[n]); 
} 

int main() 
{ 
    auto p1 = make_unique<int>(3); 
    auto p2 = make_unique<int[]>(3); 
} 

참고 : 여기에

#include <memory> 
#include <utility> 

namespace Aux { 
    template<typename Ty> 
    struct MakeUnique { 
     template<typename ...Args> 
     static std::unique_ptr<Ty> make(Args &&...args) { 
      return std::unique_ptr<Ty>(new Ty(std::forward<Args>(args)...)); 
     } 
    }; 

    template<typename Ty> 
    struct MakeUnique<Ty []> { 
     template<typename ...Args> 
     static std::unique_ptr<Ty []> make(Args &&...args) { 
      return std::unique_ptr<Ty []>(new Ty[sizeof...(args)]{std::forward<Args>(args)...}); 
     } 
    }; 
} 

template<typename Ty, typename ...Args> 
std::unique_ptr<Ty> makeUnique(Args &&...args) { 
    return Aux::MakeUnique<Ty>::make(std::forward<Args>(args)...); 
}