gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:45 25 4
gpt4 key购买 nike

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

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

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

不过,如果 C++11 让我做类似的事情就好了:

map<string, unique_ptr_base> data;

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

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

最佳答案

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

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

关于C++-11 用于异构对象的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com