当前,我正在存储std::unique_ptr
的集合以堆放分配的多态类型的对象:
struct Foo {
virtual ~Foo() = default;
};
Collection<std::unique_ptr<Foo>> foos;
我需要的基本界面是将Foo
的所有者放入/从foos
引入。存储在foos
中的对象永远都不应该是nullptr
,因此我想用编译时检查替换运行时assert(owner_taken)
。此外,我希望能够在可能为空的所有者的情况下使用非空所有者。
可能是,我需要存储类似unique_ref
的东西,但是我该如何从foos
中提取一个呢?我不需要副本,我想要存储的对象本身,所以owner->clone()
不是解决方案。我也不能std::move(owner)
,因为此后“唯一引用”的状态将无效。
是否有一个清晰的设计决定?
堆分配的对象是否存在永不为零的唯一所有者?