【发布时间】:2016-03-20 22:28:28
【问题描述】:
我了解将static_pointer_cast 与unique_ptr 一起使用会导致所包含数据的共享所有权。
换句话说,我想做的是:
unique_ptr<Base> foo = fooFactory();
// do something for a while
unique_ptr<Derived> bar = static_unique_pointer_cast<Derived>(foo);
无论如何,这样做会导致两个 unique_ptr 永远不应该同时存在,所以它是被禁止的。
是的,这是有道理的,绝对是,这就是为什么确实不存在像static_unique_pointer_cast 这样的东西。
到目前为止,如果我想存储指向这些基类的指针,但我还需要将它们转换为一些派生类(例如,想象一个涉及类型擦除的场景),我使用了shared_ptr s 因为我上面提到的。
无论如何,我在猜测是否有替代 shared_ptrs 来解决此类问题,或者它们是否真的是这种情况下的最佳解决方案。
【问题讨论】:
-
static_pointer_cast只为std::shared_ptr<T>类型的参数定义 - 它根本不能用于unique_ptr -
@M.M 是的,我知道,我在问题中写的几乎相同,说不存在
unique_ptr的等价物。 -
为什么类型擦除会导致向下转换?如果您需要将基类转换为派生类型,除了极少数情况外,这通常是一个应该以不同方式解决的设计问题。
-
@Jens Imagine
struct B { virtual void f() = 0; }; template<class T> struct D: public B { void f() override { /* do something with D */ } };,你做过类似的事情吗?通过包装器和static_pointer_cast的良好组合,您可以创建很多有趣的东西。 -
@javaLover 好吧,我想说其他答案有一个更直接和更干净的方法,但是......它有效......就是这样。 :-)
标签: c++ c++11 casting shared-ptr unique-ptr