哎,這個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還可以擁有它)。
因此,假設智能指針具有這種能力,並且能夠被重新初始化爲任意的指針(像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);
您的意思是:'shared_ptr'? – avakar