我正在实践智能指针类。
我已经定义了一个赋值运算符重载,它接受同一个类的另一个实例。现在我想定义一个带有任何指针的运算符的重载。所以我应该能够做smartPointer = &someObject;
或smartPointer = NULL;
之类的事情。
我该怎么做呢?我应该传递void*
吗?还有别的吗?
作为一个更普遍的问题(我知道这很少需要):什么样的参数告诉编译器可以传入任何指针?
答案 0 :(得分:1)
您可以使用模板函数使对象允许指定任何指针。
template<typename T>
void operator=(T* obj)
{
//Your code here
}
但是,它不是一个智能指针,如果你可以为它分配任何原始指针,因为它可以分配给多个智能指针对象,然后在删除指针时会出现问题。
答案 1 :(得分:1)
以下可能会有所帮助:
class MySharedPointer
{
public:
template <typename T>
MySharedPointer& operator = (T* p)
{
ptr.reset(p, [](void* p) { delete static_cast<T*>(p); });
return *this;
}
// nullptr is not a pointer, so it should have its own overload.
MySharedPointer& operator = (std::nullptr_t) {
ptr.reset();
return *this;
}
private:
std::shared_ptr<void> ptr;
};