std :: reference_wrapper / std :: unique_ptr替代std :: vector,用于存储多态值

时间:2018-02-09 06:15:55

标签: c++ vector stl polymorphism move

我通常将std::vector中的对象存储为值,并使用std :: move来转移所有权。问题是,当与多态对象一起使用时,按值存储会导致切片。

此博客:https://oopscenities.net/2012/08/09/reference_wrapper/显示std::vector可用于在std::vector中存储多态对象。问题是,由于std::reference_wrapper只是存储对象的引用,因此必须保证对象的生命周期为std::vector<std::reference_wrapper<>>的生命周期。

例如:

class PolymorphicClass; //derived from SuperClass
namespace MyProject
{
    class MyClass
    {

    public:
        std::vector<std::reference_wrapper<SuperClass>> _member;
    };
}

int main()
{
    MyClass test;
    test._member.push_back(PolymorphicClass());
}

这不会起作用。而不是std::reference_wrapper我可以使用std::unique_ptr,但我想知道是否还有其他选项。

1 个答案:

答案 0 :(得分:1)

这完全取决于所有权,矢量与其元素相对应。如果您希望向量拥有,那么前进的方法是unique_ptr

如果您希望向量共享所有权以及代码中的其他系统,则可以使用shared_ptr

如果你不希望向量拥有对象的任何所有权,但仍然能够检查它们是否已被删除,那么前进的方法是weak_ptr。 考虑到最后两个选项需要使用shared_ptr创建对象,存储引用堆栈中分配的对象的共享指针(例如)将是讨厌的。