使用std :: shared_ptr <void>指向任何东西

Bru*_*uce 5 c++ stl smart-pointers shared-ptr c++11

我正在std::shared_ptr<void>我的应用程序中使用一个智能指针,它可以指向许多不同类型的数据结构,如结构,向量,矩阵......基本上任何东西.我要做的是将一些名称映射到他们的数据结构.

我正在使用哈希表执行映射:

std::unordered_map<std::string, std::shared_ptr<void>>

我可以把std::shared_ptr<void>返回的人投find()回去std::shared_ptr<my_type>吗?如果是这样,怎么样?

更重要的是,这是一种好的做法吗?随着应用程序的扩展,这会增加复杂性吗?或者,还有其他一些完全不同,优雅的方法吗?

编辑

可能不能使用`Boost.Any',因为它使用RTTI.

也不能为所有这些数据结构使用基类,因为它们中的一些是STL容器std::vector.

关于在shared_ptr下面的答案中讨论的删除问题,我读到shared_ptr执行类型擦除并存储类型信息以知道要调用的析构函数.

共享的void指针.为什么这样做?

为什么std :: shared_ptr <void>有效

为什么shared_ptr <void>不是专门的?

但我不确定这一点.

fil*_*mor 4

这不是一个好的做法。如果您没有在您的旁边存储其他类型信息std::shared_ptr(您可以使用 进行转换static_pointer_cast),那么您周围的行为都是未定义的。也许Boost.Any适合您?

如果您想坚持使用,std::shared_ptr<void>请记住提供自定义删除器函数(请参阅make shared_ptr not use delete)。

  • `std::shared_ptr&lt;void&gt;` 实际上并不调用 UB。 (3认同)
  • 不是通过其本身,而是将指针强制转换为另一种类型(即“p”指向“Base”对象,但被强制转换为“Derived”),然后取消引用。 (2认同)