指针包装类-行为就像一个原始指针

pointer wrapper class - behave just like a raw pointer

本文关键字:指针 一个 原始 包装类 -行      更新时间:2023-10-16

我想要一个指针包装器类,它的行为就像一个原始指针,但也保存一个特殊的整数随着指针(类型的索引在数组它来自)

我设法让它的行为主要像一个指针。我知道,指针比较解决方案可能不是最优的,但这不是我的主要问题。我想用2个参数(指针,indexToArr)构造包装器,除非指针为NULL -然后我不关心indexToArr。

我想解决的问题是如何允许返回NULL就像一个正常的指针允许。当前的解决方案使用ASSERT。但我想要一些在编译时工作的东西。在一个特殊的模板方法的精神——只允许NULL作为它的参数。

当前版本:

class PtrWrapper
{
public:
    PtrWrapper(Type* ptr, int indToArr) 
        : m_ptr(ptr), m_indexToArr(indToArr){}
    //allow returning NULL, only NULL
    PtrWrapper(Type* ptr) : m_ptr(NULL), m_indexToArr(-1) {ASSERT(ptr == NULL);}
    Type* operator->() const {return m_ptr;}
    Type& operator*() const {return *m_ptr;}
    int IndexToArr() const {return m_indexToArr;}
    //for pointer comparison
    operator Type*() const {return m_ptr;}
private:
    Type* m_ptr;
    int m_indexToArr;
};

有什么想法和建议吗?

谢谢,狮子座

template<typename Type>
class PtrWrapper
{
    typedef struct { } NotType;
public:
    Ptr() { }
    Ptr(const NotType* nullPtr) { }
    Ptr(Type* p, int index) { }
};

您可以利用字面量NULL/0可以自动转换为任何指针类型的事实。创建一个不是T的类型,和一个构造函数,它接受一个指向那个没有人会使用的类型的指针。现在可以显式地处理PtrWrapper<T> x(NULL);了。

当然,正如其他人所说,这只会在编译时知道NULL的情况下工作。

简单地创建一个没有参数的默认构造函数,将指针初始化为NULL,但请确保在operator*operator->中对NULL指针进行一些检查。

执行以下操作:

PtrWrapper(Type* ptr) : m_ptr(ptr), m_indexToArr(0) {ASSERT(ptr != NULL);}
PtrWrapper() : m_ptr(NULL), m_indexToArr(-1) {ASSERT(ptr == NULL);}