我听说过诸如 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++ 库提供此功能)。
欢迎任何建议:)