std::shared_ptr、std::unique_ptr (および std::array boost::shared_array などの配列クラス) のようなスマート ポインターを聞いたことがありますが、これらのポインターは算術演算をサポートしていません。
通常のポインターのように機能する配列専用のスマート ポインター型が必要です。つまり、++p、p++、p--、p+n、n+p、*p、p[n]、p- を持つことができます。 > オペレーターなど
だから私はクラスArrayPtrを書きました:
template <typename T>
class ArrayPtr final
{
public:
typedef size_t size_type;
ArrayPtr() noexcept;
ArrayPtr(nullptr_t) noexcept;
ArrayPtr(T p[], size_type size);
ArrayPtr(const ArrayPtr &p);
~ArrayPtr();
ArrayPtr & operator = (const ArrayPtr &p);
ArrayPtr & operator += (size_type offset);
ArrayPtr & operator -= (size_type offset);
T & operator * () const noexcept; // dereference *p
T & operator [] (size_type index) const;// dereference p[index]
T * operator -> () const noexcept; // dereference p->
ArrayPtr operator + (size_type offset) const;
ArrayPtr operator - (size_type offset) const;
ArrayPtr & operator ++ (); // prefix ++p
ArrayPtr operator ++ (int); // suffix p++
ArrayPtr & operator -- (); // prefix --p
ArrayPtr operator -- (int); // suffix p--
inline T * get() const noexcept;
inline T * getFirst() const noexcept;
inline T * getLast() const noexcept;
inline size_type getPos() const noexcept;
inline size_type getSize() const noexcept;
private:
void addPtr(T p[], size_type size);
void removePtr(T p[]);
private:
T *m_ptr;
size_type m_pos;
size_type m_size;
struct PtrCounter
{
T *ptr;
size_type size;
size_type count;
};
static vector<PtrCounter> sm_ptrCounters;
};
これは shared_ptr のように機能しますが、動的配列を作成するには、次のことを行う必要があります:ArrayPtr p(new int[8], 8)
配列要素にアクセスするときは、p[3] = 10;
または*(p+4) = 20;
そして、あなたはまた持つことができp++
ますp += 5
配列の範囲外のインデックスを指定しようとすると、OutOfBound 例外がスローされます。
静的メンバー sm_ptrCounters を使用して、同じ配列を指すポインターの数を記録します。
これを行うことの利点はわかりません。私は一貫性を保つことを望んでいる単なるオタクです。そして、なぜこれを行うべきではないのかを知りたいです (この機能を提供する C++ ライブラリがないため)。
どんな提案も大歓迎です:)