En bakımdan std::unique_ptr
için (ama daha güvenli) yerine düşüş olması için yapıldı std::auto_ptr
kullanım ya kod yönlendiren (varsa) (sorduğunuz gibi) kod değişiklikleri dışında gerekli yüzden çok az olmalıdır, unique_ptr
ya da auto_ptr
.
Bunu yapmanın birkaç yolu vardır (ve her biri kendi liste ödünçleriyle birlikte gelir). Verilen kod örneği göz önüne alındığında, ilk iki seçenekten birini tercih ederim .
seçenek 1
#if __cplusplus >= 201103L
template <typename T>
using auto_ptr = std::unique_ptr<T>;
#else
using std::auto_ptr;
#endif
tradeoffs;
- Sen tanıtmak
auto_ptr
küresel ad alanına; bunu kendi "özel" ad alanınız olarak tanımlayarak hafifletebilirsiniz.
- C ++ 17'ye geçtikten sonra (
auto_ptr
tamamen kaldırılacağına inanıyorum ) daha kolay arama ve değiştirme yapabilirsiniz
seçenek 2
template <typename T>
struct my_ptr {
#if __cplusplus >= 201103L
typedef std::unique_ptr<T> ptr;
#else
typedef std::auto_ptr<T> ptr;
#endif
};
tradeoffs;
- Muhtemelen çalışmak daha hantal
auto_ptr
, koddaki tüm mevcut ihtiyaç gibi bir şeye değiştimy_ptr<T>::ptr
- Daha iyi güvenlik, adların global ad alanına girmemesi
Seçenek 3
Biraz tartışmalı, ancak std
bir üs olarak bir sınıfa sahip olma uyarılarına katlanmak için hazırsanız
#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
tradeoffs;
- Sanal bir tabanın (özellikle sanal olmayan yıkıcı) beklendiği kalıtsal sınıfı kullanmaya çalışmayın. Bu durumun bir sorun olması gerektiği değil - ama bunun farkında olun
- Yine, kod değişir
- Potansiyel ad alanı uyuşmazlıkları - her şey işaretçi sınıfının başlangıçta nasıl kullanıldığına bağlıdır
Seçenek 4
İşaretçileri yeni bir sınıfa sarın ve gerekli işlevleri üyeye toplayı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(); }
};
tradeoffs;
- Gerçekten istediğiniz tek şey, uygulamaları "değiştirmek"
auto_ptr
scoped (yanistd::auto_ptr
), olmaları gereken veya akıllı işaretçi başka ad elde edilebilir mi?