STD :: Referent_wrapper/std :: std :: vector的selution_ptr替代品

std::reference_wrapper/std::unique_ptr alternative for std::vector that stores polymorphic value

本文关键字:std 替代品 selution ptr Referent wrapper STD vector      更新时间:2023-10-16

i通常将对象存储在 std::vector中,并使用std ::移动以转移所有权。问题在于,与多态对象一起使用时,按值存储可能会导致切片。

此博客:https://oopscenities.net/2012/08/09/reference_wrapper/表明std::vector可用于将多态对象存储在std::vector中。问题是,由于std::reference_wrapper只是存储对对象的引用,因此必须在std::vector<std::reference_wrapper<>>的终生时间内保证对象的寿命。

eg:

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::unique_ptr,而不是std::reference_wrapper,但我想知道是否还有其他选择。

所有权的全部取决于该矢量的元素。如果您希望向量自己的它们,那么要走的方法是unique_ptr

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

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