我想要一个指针包装器类,它就像一个原始指针一样,但也保存一个特殊的整数和指针(它来自的数组中的Type索引)
我设法让它的行为大致像指针一样。我知道指针比较解决方案可能不是最佳的,但这不是我的主要问题。 我希望使用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;
};
任何想法,建议?
谢谢, 利奥
答案 0 :(得分:5)
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
时才会起作用。
答案 1 :(得分:1)
只需创建一个没有参数的默认构造函数,将您的指针初始化为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);}