Должен ли я реализовать интеллектуальный тип указателя для массива и поддерживать арифметические операторы?

Я слышал умные указатели, такие как 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 ++ не предоставляет такую ​​возможность).

Любое предложение приветствуется 🙂

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]