【发布时间】:2014-05-04 11:12:40
【问题描述】:
我在我的应用程序中使用std::shared_ptr<void> 来创建一个智能指针,它可以指向许多不同类型的数据结构,如结构、向量、矩阵......基本上任何东西。我正在尝试做的是将一些名称映射到它们的数据结构。
我正在使用哈希表执行映射:
std::unordered_map<std::string, std::shared_ptr<void>>
我可以将find()返回的std::shared_ptr<void>转换回std::shared_ptr<my_type>吗?如果有,怎么做?
更重要的是,这是一种好的做法吗?随着应用程序的扩展,这是否会增加太多的复杂性?或者,还有其他完全不同的优雅方法吗?
编辑
可能无法使用 `Boost.Any',因为它使用 RTTI。
也不能为所有这些数据结构使用基类,因为其中一些是像std::vector 这样的 STL 容器。
关于下面的答案中讨论的shared_ptr 删除问题,我读到 shared_ptr 执行 类型擦除 并存储类型信息以知道要调用哪个析构函数。
Shared void pointers. Why does this work?
Why do std::shared_ptr<void> work
Why is shared_ptr<void> not specialized?
但我不确定。
【问题讨论】:
-
你可能想看看Boost Any。
-
@JoachimPileborg 谢谢你的建议,你能看看我对下面答案的评论吗?
-
为什么 RTTI 是个问题?你怎么知道
map["foo"]中存储的类型? -
@DavidRodríguez-dribeas 在应用程序中我知道映射到任何
foo的类型
标签: c++ c++11 stl shared-ptr smart-pointers