呃,这个 API 很丑。
我将假设该函数承诺它“返回”的指针拥有一个资源,该资源将被调用者以这种方式删除smart_ptr
,并且smart_ptr
可以从任意指针初始化。否则不能这样做。
您可以像在没有智能指针的情况下一样抓住指针,然后将其放入智能指针中。
T* ptr;
Foo(ptr);
smart_ptr<T> val(ptr);
可能的情况是智能指针已经拥有某些东西,而您想将该东西传递给函数,然后替换智能指针拥有的东西。那……更难看。
我不知道该函数是否会获得您传入的资源的所有权(通常,我希望不会,但由于 API 如此丑陋,我不会发誓)。这导致了两种不同的情况。
如果函数取得您传递的资源的所有权,即它关心删除指针本身,则智能指针类型必须是可以放弃资源所有权的类型,就像std::unique_ptr
成员release()
函数一样。值得注意的是,std::shared_ptr
不能这样做(考虑到其他shared_ptr
s 也可能拥有它)。
因此,假设智能指针具有该功能,并且能够重新初始化为任意指针(例如 with std::unique_ptr::reset
),您可以执行以下操作:
//smart_ptr<T> val;
T* ptr = val.release();
Foo(ptr);
val.reset(ptr);
如果函数不获取资源的所有权,则所需要的只是使用任意指针重新初始化的能力。
//smart_ptr<T> val;
T* ptr = val.get();
Foo(ptr);
val.reset(ptr);