首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++-11,用于异构对象的映射

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

Stack Overflow用户
提问于 2013-07-07 07:58:01
回答 1查看 1.2K关注 0票数 4

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

代码语言:javascript
复制
map<string, pair<void *, Deleter> > data;

无论何时检索对象(通过模板化方法),它都会被转换回请求的类型。缓存的析构函数只需调用Deleter并从map中删除该对。这一切都行得通。

但是,如果C++11允许我这样做,那就太好了:

代码语言:javascript
复制
map<string, unique_ptr_base> data;

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-07 08:03:57

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

代码语言:javascript
复制
std::unique_ptr<void, void (*)(void *)>

例如:

代码语言:javascript
复制
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)); });
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17508150

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档