我应该为数组实现智能指针类型并支持算术运算符吗?

时间:2013-11-11 07:58:38

标签: c++ operator-overloading smart-pointers pointer-arithmetic

我听说过像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 个答案:

没有答案