我通常将对象存储在 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/