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. 为什么不std :: weak_ptr有operator->?
- 4. 将shared_ptr转换为weak_ptr多态性
- 5. std :: bind和std :: weak_ptr
- 6. static_pointer_cast通过继承和模板
- 7. boost :: static_pointer_cast vs boost :: shared_static_cast有什么区别?
- 8. weak_ptr是如何工作的?
- 9. 如何make_pair包括了weak_ptr
- 10. 是否通过了weak_ptr
- 11. 将auto_ptr分配给weak_ptr
- 12. 为什么std :: hash没有在C++ 0x中为std :: weak_ptr定义?
- 13. 的boost ::蟒蛇的weak_ptr:东西消失
- 14. 将shared_ptr向下转换为包含weak_ptr C++的派生类11
- 15. 使用std ::的weak_ptr解决拉姆达
- 16. VS10中的weak_ptr比较存在问题
- 17. 到期后boost :: weak_ptr的排序顺序?
- 18. 名称`weak_ptr :: lock()`的原因是什么?
- 19. weak_ptr的基类,而shared_ptr是派生类?
- 20. 传递给方法时,我应该将shared_ptr转换为weak_ptr吗?
- 21. 为什么std :: weak_ptr <>不提供布尔转换?
- 22. std :: set :: boost :: weak_ptr <T> - 将const_iterator转换为const T?
- 23. 如何检查weak_ptr是否为空(未分配)?
- 24. C++绑定到weak_ptr不工作
- 25. 通过std :: weak_ptr删除一个对象
- 26. weak_ptr与unique_ptr一起工作吗?
- 27. c + +提高:: shared_ptr的和提高:: weak_ptr的&dynamic_cast的
- 28. 的std :: weak_ptr的分配使用的std :: make_shared
- 29. 如何一个boost :: weak_ptr的以一个boost :: shared_ptr的
- 30. 的boost :: weak_ptr的<T> .lock()崩溃了SIGSEGV段错误
你是否知道这个历史?鉴于这是写得多么微不足道,我想知道为什么标准委员会没有包括它。 – tgoodhart 2011-05-20 15:02:39
我只是扫描的文档标准,像没有人提出这在我看来。我也无法找到被要求或升压提出(的std :: weak_ptr的原始源)它的记录。也许原因在于编写代码很简单,并且选择合适的策略(throw或null)是非常重要的。并且提供两个函数(每个策略一个函数)是次优的,因为'static_pointer_cast'是一个通用名称,可用于指针类型为通用的代码。 – 2011-05-20 17:30:16