ほとんどの点で、これstd::unique_ptr
はドロップイン(ただし、より安全)に置き換えられているためstd::auto_ptr
、コードを(または)のどちらunique_ptr
かを使用するように指示する以外に(必要に応じて)コードの変更はほとんど必要ありませんauto_ptr
。
これを行うにはいくつかの方法があります(それぞれに独自のリストトレードオフがあります)。提供されたコードサンプルを考えると、最初の2つのオプションのいずれかを優先します。
オプション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
)は、他のネームスペースからスマートポインターを取得する必要がありますか?