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

C++ 我应该为数组实现智能指针类型并支持算术运算符吗?,c++,operator-overloading,smart-pointers,pointer-arithmetic,C++,Operator Overloading,Smart Pointers,Pointer Arithmetic,我听说过像std::shared\u ptr、std::unique\u ptr这样的智能指针(另外还有像std::array boost::shared\u array这样的数组类),但这些指针不支持算术运算 我想要一个智能指针类型,只用于与普通指针类似的数组,换句话说,它可以有++p,p++,p-,p+n,n+p,*p,p[n],p->运算符等 所以我写了一个类Arrayptor: template <typename T> class ArrayPtr final { publ

我听说过像std::shared\u ptr、std::unique\u ptr这样的智能指针(另外还有像std::array boost::shared\u array这样的数组类),但这些指针不支持算术运算

我想要一个智能指针类型,只用于与普通指针类似的数组,换句话说,它可以有++p,p++,p-,p+n,n+p,*p,p[n],p->运算符等

所以我写了一个类Arrayptor:

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;
};
模板
类ArrayPtr期末考试
{
公众:
typedef size_t size_type;
ArrayPtr()不例外;
ArrayPtr(nullptr_t)无例外;
ArrayPtr(tp[],大小\ U型大小);
ArrayPtr(const ArrayPtr&p);
~ArrayPtr();
ArrayPtr&operator=(常数ArrayPtr&p);
ArrayPtr&运算符+=(大小_类型偏移);
ArrayPtr&运算符-=(大小\类型偏移);
T运算符*()const noexcept;//解引用*p
T运算符[](大小\类型索引)常量;//解引用p[index]
T*运算符->()const noexcept;//解引用p->
ArrayPtr运算符+(大小\类型偏移)常量;
ArrayPtr运算符-(size_type offset)常量;
ArrayPtr&运算符+++();//前缀++p
ArrayPtr运算符++(int);//后缀p++
ArrayPtr&运算符--();//前缀--p
ArrayPtr运算符--(int);//后缀p--
内联T*get()常量noexcept;
内联T*getFirst()常量noexcept;
内联T*getLast()常量noexcept;
内联大小_type getPos()const noexcept;
内联大小\类型getSize()常量noexcept;
私人:
void addPtr(tp[],尺寸\ U型尺寸);
空洞清除率(tp[]);
私人:
T*m_ptr;
尺寸/类型/位置;
尺寸类型m尺寸;
结构计数器
{
T*ptr;
大小\类型大小;
大小和类型计数;
};
静态矢量sm_ptr计数器;
};
它的作用类似于shared_ptr,但要创建一个动态数组,您应该这样做:
arrayptrp(newint[8],8)
访问数组元素时,可以使用
p[3]=10
*(p+4)=20

您还可以使用
p++
p+=5

当您试图给出超出数组边界的索引时,它会抛出一个OutOfBound异常

我使用静态成员sm_ptrCounters记录指向同一数组的指针数

我说不出这样做有什么好处,我只是个书呆子,希望事情保持一致。我想知道为什么我不应该这么做(因为没有C++库提供这个特性)。
欢迎任何建议:)

这就是迭代器的用途(就像标准容器或数组上的指针一样)!您不需要自己实现它。此外,这个帮助器类不是很聪明,因为您必须自己清理内存。不需要
内联
说明符,默认情况下成员函数是内联的。@SChepurin当sm_ptrCounter.count==0@Manu343726真正地我记得在类主体中定义的成员函数是隐式内联的