从强制转换的std :: shared_ptr

时间:2019-04-02 08:51:34

标签: c++ c++11

我有一个向量,其中包含一组共享指针:

std::vector<std::shared_ptr<Derived>> originalVector;

在某个时候它强制转换为Base共享指针,如下所示:

std::vector<std::shared_ptr<Base>>* castedVector = reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);

如何将Derived项目添加到强制转换向量?显然我可以在其中放置一个空的std::shared_ptr,这个新的共享指针是否了解它所持有的类型,它可以创建这种类型的对象吗?

更新:将shared_ptr强制转换为基类后,无法创建原始对象。强制转换后,它将丢失有关原始基础类型的所有信息。 而且:reinterpret_cast是未定义的行为。

2 个答案:

答案 0 :(得分:0)

您应该能够将派生类指针添加到基类指针的向量。然后将派生的指针转换为基本指针。这有点与智能指针的功能无关。将向量创建为基础元素的向量还是将其转换为基本元素都没有关系,

std::vector<std::shared_ptr<Base>> bases;

// Create a Derived instance
auto derived = std::make_shared<Derived>();
bases.push_back(derived);

// Only create a pointer (might as well just create a Base pointer)
std::shared_ptr<Derived> emptyPointer;
bases.push_back(emptyPointer)

答案 1 :(得分:0)

std::vector<std::shared_ptr<Base>>* castedVector =
    reinterpret_cast<std::vector<std::shared_ptr<Base>>*>(&originalVector);

这是不确定的行为,请执行此操作。

您可以通过复制而不是躺在类型系统上来创建指向基础的指针vector

std::vector<std::shared_ptr<Base>> baseVector(originalVector.begin(), originalVector.end());

这包含原始指针的副本,这些副本与它们共享所有权,但是所包含的指针是Base*而不是Derived*

很显然,如果您在originalVector中插入新值,则不会在baseVector中插入,因此您需要制作整个originalVector的新副本或将其插入同时进入两者。