2011-05-19 29 views
13

C++ 0x中,有一個std :: static_pointer_cast性病:: shared_ptr的,但對於標準::的weak_ptr沒有等效方法。這是故意的還是疏忽?如果疏忽,我將如何定義適當的功能?static_pointer_cast爲的weak_ptr

回答

9

這應該爲你做它:

template<class T, class U> 
std::weak_ptr<T> 
static_pointer_cast(std::weak_ptr<U> const& r) 
{ 
    return std::static_pointer_cast<T>(std::shared_ptr<U>(r)); 
} 

這將拋出一個異常,如果的weak_ptr已過期。如果您更希望得到一個空的weak_ptr,然後使用r.lock()代替。

+0

你是否知道這個歷史?鑑於這是寫得多麼微不足道,我想知道爲什麼標準委員會沒有包括它。 – tgoodhart 2011-05-20 15:02:39

+2

我只是掃描的文檔標準,像沒有人提出這在我看來。我也無法找到被要求或升壓提出(的std :: weak_ptr的原始源)它的記錄。也許原因在於編寫代碼很簡單,並且選擇合適的策略(throw或null)是非常重要的。並且提供兩個函數(每個策略一個函數)是次優的,因爲'static_pointer_cast'是一個通用名稱,可用於指針類型爲通用的代碼。 – 2011-05-20 17:30:16

2

霍華德的版本是正確的,但在許多情況下是有意義的只是通過weakptr.lock()作爲參數爲std :: static_pointer_cast:

std::weak_ptr<A> a = ...; 
std::weak_ptr<B> b = std::static_pointer_cast<B>(a.lock()); 

這句法明確顯示是怎麼回事,和品牌代碼易於閱讀。

+0

好像有一個錯誤在這裏。由於a.lock()是一個臨時指針,所以在此之後的代碼仍然使用b時,可以刪除底層指針。 - 實際上在再次閱讀static_pointer_cast文檔後,我錯了。它返回一個共享指針,它將與一個底層共享指針共享。 – 2017-04-05 17:58:42

0

遺漏是故意的,因爲儘管它的名字,性病:: weak_ptr的不是指針類型,不提供指針接口(運營商 - >運算符*,static_pointer_cast等)。