[英]A (different) helper for `std::unique_ptr`
我看到只有一個與std::unique_ptr
關聯的非成員實用程序助手,並且它調用new
。 如何使用一種包裝現有原始指針而無需顯式命名類型的實用程序呢?
特別是,假設有一些類似以下內容的遺留代碼或外部庫:
C* foo(); // caller is responsible for deleting
也就是說,某些函數應該編寫為返回unique_ptr<C>
,但不是,並且調用者無法更改它。
我認為使用此功能的正確方法是:
unique_ptr<C> up (foo());
但這需要命名類型,而不是使用auto
。 這就引出了一個問題,即為什么沒有幫助函數會使用模板參數推導並編寫類似以下內容的問題:
auto up= capture_unique(foo());
理想情況下,甚至在聲明變量時提供=
語法,並自行找出類型。
這是一種自然的編寫方式,我無法想象自己是第一個想到它的人。 是否存在一些隱藏的危險,使得無法在足夠普遍的情況下編寫此代碼? 或者,為什么沒有將make_unique
和unique_ptr
模板作為標准的一部分提供?
滿足您描述的要求的最簡單的代碼是:
template<typename T>
auto capture_unique(T* ptr)
{
return std::unique_ptr<T>{ptr};
}
這將與示例代碼很好地配合;
auto up = capture_unique(foo());
本質上, capture_unique
與直接使用unique_ptr
構造函數之間幾乎沒有什么不同,除了您所說的重新鍵入C
類型。
auto up = std::unique_ptr<C>{foo()};
對於通用代碼,您可以使用decltype
和declval
等。通用的用例可能不存在。
同樣,對於std::shared_ptr
存在一個問題,在該問題中再次沒有“捕獲”類型的幫助器方法,再次創建一個方法很簡單。 shared_ptr
情況和unique_ptr
之間的區別在於,刪除器是unique_ptr
而不是shared_ptr
。
是否存在一些隱藏的危險,使得無法在足夠普遍的情況下編寫此代碼?
沒有隱藏的危險,只有一些未回答的關於使用哪種類型的一般問題。 但是如上所述,創建起來很容易。
或者,為什么沒有將
make_unique
和unique_ptr
模板作為標准的一部分提供?
刪除器是該類型的一部分,這很可能是不創建實用程序捕獲方法的好理由(因此,該刪除器也不會鏡像到shared_ptr
)。 如果刪除程序是默認的delete
,則capture_unique
將無法提供更好的語法-這可能會比較麻煩。
注意:“工廠”方法make_unique
和make_shared
使用new
運算符,並將其與默認的delete
deleter結合使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.