C++ 0x中,有一個std :: static_pointer_cast性病:: shared_ptr的,但對於標準::的weak_ptr沒有等效方法。這是故意的還是疏忽?如果疏忽,我將如何定義適當的功能?static_pointer_cast爲的weak_ptr
13
A
回答
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()
代替。
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等)。
相關問題
- 1. std :: move into static_pointer_cast:爲什麼static_pointer_cast沒有右值引用超載?
- 2. 與weak_ptr的
- 3. static_pointer_cast通過繼承和模板
- 4. boost :: static_pointer_cast vs boost :: shared_static_cast有什麼區別?
- 5. 將shared_ptr轉換爲weak_ptr多態性
- 6. 爲什麼不std :: weak_ptr有operator->?
- 7. 升壓範圍weak_ptr
- 8. std :: bind和std :: weak_ptr
- 9. weak_ptr是如何工作的?
- 10. 比較兩套std :: weak_ptr
- 11. 將auto_ptr分配給weak_ptr
- 12. 是否通過了weak_ptr
- 13. std :: map with std :: weak_ptr key
- 14. 如何make_pair包括了weak_ptr
- 15. weak_ptr,make_shared和內存釋放
- 16. 爲什麼std :: hash沒有在C++ 0x中爲std :: weak_ptr定義?
- 17. 的boost ::蟒蛇的weak_ptr:東西消失
- 18. 錯誤C2065:'static_pointer_cast':未聲明的標識符 - Visual Studio 2010
- 19. 將shared_ptr向下轉換爲包含weak_ptr C++的派生類11
- 20. VS10中的weak_ptr比較存在問題
- 21. 使用Boost的shared_ptr和weak_ptr構造樹
- 22. weak_ptr的基類,而shared_ptr是派生類?
- 23. 共享資源OWNAGE使用std :: weak_ptr的
- 24. 名稱`weak_ptr :: lock()`的原因是什麼?
- 25. 關於weak_ptr的競賽條件
- 26. 到期後boost :: weak_ptr的排序順序?
- 27. 使用std ::的weak_ptr解決拉姆達
- 28. weak_ptr中的比較運算符C++
- 29. 使用weak_ptr的觀察者模式
- 30. 爲什麼我不能投nullptr到了weak_ptr <>
你是否知道這個歷史?鑑於這是寫得多麼微不足道,我想知道爲什麼標準委員會沒有包括它。 – tgoodhart 2011-05-20 15:02:39
我只是掃描的文檔標準,像沒有人提出這在我看來。我也無法找到被要求或升壓提出(的std :: weak_ptr的原始源)它的記錄。也許原因在於編寫代碼很簡單,並且選擇合適的策略(throw或null)是非常重要的。並且提供兩個函數(每個策略一個函數)是次優的,因爲'static_pointer_cast'是一個通用名稱,可用於指針類型爲通用的代碼。 – 2011-05-20 17:30:16