复制基础 class 参考值以映射 shared_ptr

Copy base class reference value to map with shared_ptr

我有一个基础 class 和派生 class(BaseObj 和 Derived Obj),我需要一个包含指向对象指针的字符串键映射:

std::map<std::string, std::shared_ptr<BaseObj>

复杂的是:映射值需要在堆上,因为对象将超出范围,但是对象通过引用传递给函数:

void insert_in_map(std::string, const& BaseObj);

由于引用是基 class,因此(据我所知)无法将基础值复制到堆并获得指向它的基指针。我能想到的唯一解决方案是更改函数原型以接受已经在堆上分配对象的 shared_ptr 。但是,我真的想避免在所有调用者中创建 shared_ptr,特别是因为必须将 shared_ptr 复制到地图中。

有什么想法吗?

Any ideas?

是的,您应该将函数签名更改为:

void insert_in_map(std::string, std::unique_ptr<BaseObj>);

所以这将清楚地表明函数取得了对象的所有权。您的地图可能也应该更改为 std::unique_ptr 而不是共享地图,除非您确实需要共享所有权。在这种情况下,您可以将它们都更改为 std::shared_ptr(这可能比在函数内部将 std::unique_ptr 转换为 std::shared_ptr 更有效)。我会创建类型别名并在这两种情况下都使用它。

However, I really would like to avoid creating the shared_ptr in all the callers, especially since the shared_ptr has to be copied into the map.

它不必被复制,它可以被移动到映射中,所以你的推理很奇怪 - 你不应该拥有一个对象的所有权,通过 const 引用传递。

如果您不能更改函数签名,您可以将虚方法 std::shared_ptr<BaseObject> clone() 添加到基 class 并相应地覆盖。但这在你的情况下似乎是不合理的,因为你可以更改函数签名,你不想出于一些奇怪的原因。