대부분의 경우 std::unique_ptr
에 대한 대체 (드롭지만보다 안전한) 대체 방법이 만들어 std::auto_ptr
졌으므로 unique_ptr
또는 코드를 요청하도록 요청하는 것 이외의 코드 변경이 거의 필요하지 않아야합니다 (있는 경우) auto_ptr
.
이 작업을 수행하는 몇 가지 방법이 있으며 (각각 자체 목록 상충 관계가 있습니다). 제공된 코드 샘플을 고려할 때 처음 두 가지 옵션 중 하나를 선호합니다 .
옵션 1
#if __cplusplus >= 201103L
template <typename T>
using auto_ptr = std::unique_ptr<T>;
#else
using std::auto_ptr;
#endif
트레이드 오프;
auto_ptr
전역 네임 스페이스에 이름을 소개합니다 . 자신의 "개인"네임 스페이스를 정의하여이를 완화 할 수 있습니다.
- C ++ 17로 마이그레이션하면 (
auto_ptr
완전히 제거 될 것이라고 생각 합니다) 더 쉽게 검색하고 바꿀 수 있습니다
옵션 2
template <typename T>
struct my_ptr {
#if __cplusplus >= 201103L
typedef std::unique_ptr<T> ptr;
#else
typedef std::auto_ptr<T> ptr;
#endif
};
트레이드 오프;
- 아마도 작업하기가 더 성 가실 것입니다. 현재 모든
auto_ptr
코드에서 다음과 같이 변경해야합니다.my_ptr<T>::ptr
- 더 나은 안전성 이름이 글로벌 네임 스페이스에 도입되지 않습니다
옵션 3
다소 논란의 여지가 있지만, std
수업을 기본으로하는 주의에 대처할 준비가되어 있다면
#if __cplusplus >= 201103L
template <typename T>
using my_ptr = std::unique_ptr<T>;
#else
template <typename T>
class my_ptr : public std::auto_ptr<T> {
// implement the constructors for easier use
// in particular
explicit my_ptr( X* p = 0 ) : std::auto_ptr(p) {}
};
#endif
트레이드 오프;
- 가상 기반 (특히 비 가상적 소멸자 포함)이 예상되는 상속 된 클래스를 사용하지 마십시오. 이 경우에 문제가되지는 않지만 알고 있어야합니다.
- 다시, 코드 변경
- 잠재적 인 네임 스페이스 불일치-모두 포인터 클래스를 사용하여 시작하는 방법에 따라 다릅니다.
옵션 4
포인터를 새 클래스로 감싸고 필요한 함수를 멤버에 집계하십시오.
template <typename T>
class my_ptr { // could even use auto_ptr name?
#if __cplusplus >= 201103L
std::unique_ptr<T> ptr_;
#else
std::auto_ptr<T> ptr_;
#endif
// implement functions required...
T* release() { return ptr_.release(); }
};
트레이드 오프;
- 당신이 정말로 원하는 모든 것은 구현을 "스왑"하는 것입니다.
auto_ptr
스코프 (예std::auto_ptr
), 그들이해야하거나 스마트 포인터가 다른 네임 스페이스에서 얻을 수 있습니까?