Trong hầu hết các khía cạnh, std::unique_ptr
đã được thực hiện để thay thế (nhưng an toàn hơn) std::auto_ptr
, do đó, sẽ có rất ít (nếu có) thay đổi mã được yêu cầu ngoài (như bạn yêu cầu) chỉ đạo mã sử dụng unique_ptr
hoặc auto_ptr
.
Có một vài cách để làm điều này (và mỗi cách đi kèm với sự đánh đổi danh sách riêng) bên dưới. Với mẫu mã được cung cấp, tôi sẽ ưu tiên một trong hai tùy chọn đầu tiên .
lựa chọn 1
#if __cplusplus >= 201103L
template <typename T>
using auto_ptr = std::unique_ptr<T>;
#else
using std::auto_ptr;
#endif
Đánh đổi;
- Bạn giới thiệu
auto_ptr
tên vào không gian tên toàn cầu; bạn có thể giảm thiểu điều này bằng cách xác định nó là không gian tên "riêng tư" của riêng bạn
- Khi đã chuyển sang C ++ 17 (tôi tin rằng
auto_ptr
sẽ bị xóa hoàn toàn), bạn có thể dễ dàng tìm kiếm và thay thế hơn
Lựa chọn 2
template <typename T>
struct my_ptr {
#if __cplusplus >= 201103L
typedef std::unique_ptr<T> ptr;
#else
typedef std::auto_ptr<T> ptr;
#endif
};
Đánh đổi;
- Có lẽ cồng kềnh hơn để làm việc với, tất cả các
auto_ptr
nhu cầu hiện tại cần thay đổi trong mã thành một cái gì đó nhưmy_ptr<T>::ptr
- An toàn hơn những cái tên không được đưa vào không gian tên toàn cầu
Lựa chọn 3
Hơi gây tranh cãi, nhưng nếu bạn chuẩn bị đưa ra những cảnh báo về việc có một std
lớp học làm cơ sở
#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
Đánh đổi;
- Đừng cố sử dụng lớp kế thừa nơi mà một cơ sở ảo (cụ thể là viết ra hàm hủy không ảo) sẽ được mong đợi. Không phải đây là một vấn đề trong trường hợp - nhưng hãy lưu ý về nó
- Một lần nữa, mã thay đổi
- Không phù hợp không gian tên tiềm năng - tất cả phụ thuộc vào cách lớp con trỏ được sử dụng để bắt đầu
Lựa chọn 4
Gói các con trỏ trong một lớp mới và tổng hợp các hàm cần thiết cho thành viên
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(); }
};
Đánh đổi;
- Một chút cực đoan khi tất cả những gì bạn thực sự muốn là "trao đổi" các triển khai
auto_ptr
phạm vi (nghĩa làstd::auto_ptr
), chúng cần phải hoặc có thể lấy được con trỏ thông minh từ một số không gian tên khác không?