智能指针大家都知道,里面保存了一个形如 T* m_Pointer的指针,当引用计数为零时自动删除m_Pointer,
当T不为void时大家都会写,但是当T为void时,编译器在编译到delete m_Pointer时必定会报错。怎么办呢?我也是苦思冥想好久才用奇技淫巧解决之。而且不光解决void的删除问题,所有类型都可以用这种方法统一解决。解决的关键在成员函数指针。
delete是运算符没办法转化成成员函数,所以声明一个类用来封装之,为了之后统一处理的方便这个类会继承自一个叫VoidClass的类,代码如下:
class VoidClass
{
public:
VoidClass()
{
m_Pointer=0;
}
VoidClass(void* p)
{
m_Pointer=p;
}
void* GetPointer(){return m_Pointer;}
bool IsNull(){return m_Pointer==0?1:0;}
private:
void* m_Pointer;
};
template<typename T>
class Destructor:public VoidClass
{
public:
Destructor(T* p):VoidClass(p)
{
}
void Do()
{
delete ((T*)GetPointer());
}
};
方便保存成员函数指针,用两个typedef将成员函数类型定义出来:
typedef void(Destructor