c++ - std::reference_wrapper/std::unique_ptr 替代存储多态值的 std::vector

标签 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但我想知道是否还有其他选择。

最佳答案

这完全取决于 vector 对其元素所持有的所有权。如果您希望 vector 拥有它们,则可行的方法是 unique_ptr

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

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

关于c++ - std::reference_wrapper/std::unique_ptr 替代存储多态值的 std::vector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48699807/

相关文章:

c++ - 从中序遍历打印所有二叉树

c++ - 使用 cin 跳过预期的字符,如 scanf()

vector - 在 OpenLayers 中为每个组件绘制不同样式的 MultiPolygon

c++ - 如何正确清理对象指针 vector 中的元素

c++ - 交换容器中两个迭代器的位置

c++ - 使用 va_list 和 printf 传递参数时的精度损失

c++:检查对象数组中类的对象

c++ - Range-for 循环识别错误类型 (C2440)

c++ - 将旧 vector 设置为新 vector

c++ - Windows 和 Linux 中使用的可执行二进制格式的低级解释