【发布时间】:2021-12-04 05:08:09
【问题描述】:
目前,我将std::unique_ptrs 的集合存储到堆分配的多态类型对象中:
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),因为之后“唯一引用”的状态将无效。
是否有干净的设计决策?
【问题讨论】:
-
如果您不允许在永不为空的唯一所有者中出现非拥有状态,那么您将永远无法离开它,因为不会有任何有效状态。所以这样的类型总是不可移动的。这真的是你想要的吗?该集合是否适用于不可移动的类型?
-
作为一种折衷方案,您可以制作自己的 nullptr-throwing unique_ptr,当它持有一个 nullptr 并尝试访问它所创建的 nullptr 时将抛出,或者如果尝试使用 nullptr 构造则抛出。 (例如,将其内脏从内部移出后,留下一个空壳。)
-
-
但是你的集合可以处理不可移动的类型吗?例如。
std::vector不能。 -
@Eljay 恐怕它与我想避免的
assert(owner)太接近了。
标签: c++ architecture null heap-memory smart-pointers