C ++ - 11用于异构对象的映射

时间:2013-07-06 23:58:01

标签: c++ c++11 stl

我有一个异构对象的缓存,按名称存储。请注意,它们没有共同的基类。在创建时我还必须存储一个Deleter对象(因为我知道那时的类型),所以地图看起来像这样:

map<string, pair<void *, Deleter> > data;

每当检索到一个对象时(通过模板化方法),它都会被转换回所请求的类型。 缓存的析构函数只调用Deleter并从映射中删除该对。一切正常。

但是,如果C ++ 11允许我做类似的事情,那就太好了。

map<string, unique_ptr_base> data;

其中unique_ptr_base是所有unique_ptr的(虚构)基类,其虚拟析构函数将删除该项。然后我可以简单地从地图中删除该项目,而不用担心重新分配。

为此目的编写一个特殊的类并不太难,但在这种情况下是不合理的,因为目前的方式只占用一行,并且没有太大的意外泄漏指针的危险。那么,我忽略了新标准的某些功能,还是应该保留原样呢?

1 个答案:

答案 0 :(得分:4)

如果你没有有状态的删除者,你几乎可以使用:

std::unique_ptr<void, void (*)(void *)>

例如:

using any_ptr = std::unique_ptr<void, void (*)(void *)>;

any_ptr p(static_cast<void *>(std::fopen("/dev/null")),
          [](void * x) { std::fclose(static_cast<FILE*>(x)); });