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



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

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

无论何时(通过模板化方法)检索对象,都会将其强制转换回请求的类型。缓存的析构函数只需调用Deleter并从映射中删除该对。这一切都有效。

然而,如果C++11允许我做这样的事情,那就太好了:

map<string, unique_ptr_base> data;

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

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

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

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)); });

最新更新