C++ 如何定义一个以任何类型的指针值作为参数的函数?
我正在实践一个智能指针类 我已经定义了一个赋值运算符重载,它接受同一类的另一个实例。现在我想定义这个操作符的重载,它接受任何指针。所以我应该能够做类似C++ 如何定义一个以任何类型的指针值作为参数的函数?,c++,pointers,assignment-operator,C++,Pointers,Assignment Operator,我正在实践一个智能指针类 我已经定义了一个赋值运算符重载,它接受同一类的另一个实例。现在我想定义这个操作符的重载,它接受任何指针。所以我应该能够做类似smartPointer=&someObject或smartPointer=NULL,等等 我该怎么做呢?我是否应该传入一个void*?还有别的吗 作为一个更一般的问题(我知道这是很少需要的):什么样的参数告诉编译器可以传入任何指针?您可以使用模板函数使您的对象允许向其分配任何指针 template<typename T> void o
smartPointer=&someObject代码>或smartPointer=NULL代码>,等等
我该怎么做呢?我是否应该传入一个void*
?还有别的吗
作为一个更一般的问题(我知道这是很少需要的):什么样的参数告诉编译器可以传入任何指针?您可以使用模板函数使您的对象允许向其分配任何指针
template<typename T>
void operator=(T* obj)
{
//Your code here
}
模板
void运算符=(T*obj)
{
//你的代码在这里
}
但是,如果您可以为其分配任何原始指针,则它不是智能指针,因为它可以分配给多个智能指针对象,因此删除指针时会出现问题。以下内容可能会有所帮助:
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;
};
类MySharedPointer
{
公众:
模板
MySharedPointer和运算符=(T*p)
{
ptr.reset(p,[](void*p){delete static_cast(p);});
归还*这个;
}
//nullptr不是指针,因此它应该有自己的重载。
MySharedPointer和operator=(std::nullptr\t){
ptr.reset();
归还*这个;
}
私人:
std::共享的ptr;
};
实际上,您可能不希望这样。因为这意味着您可以轻松地执行smartPointer1=rawPointer;smartPointer2=原始指针代码>-现在,谁删除内存?您可以使用模板方法:template MySmartPointer&MySmartPointer::operator=(T*p)
@Jarod42我考虑过,但我认为这不是我想要的,因为这意味着如果客户端执行smart\u pointer=raw\u pointer
,传入的参数将是指向指针的指针。我错了吗?@AvivCohn:要获取指向指针的指针,客户端将使用smart\u pointer=&raw\u pointer
@Jarod42等等:(T*p)
是否意味着“T
必须是指针类型”?