gpt4 book ai didi

c++ - 使用 typedef 为 std::unique_ptr 指定自定义默认删除器

转载 作者:搜寻专家 更新时间:2023-10-31 00:59:48 25 4
gpt4 key购买 nike

我有一个 C 代码,使用一些资源。它具有类似

的功能
ResourcePointer resource_new(void);
void resource_delete(ResourcePointer *res);

ResourcePointer 在哪里

typedef void * ResourcePointer;

我想为 std::unique_ptr 创建一个 typedef,指定自定义默认删除器。

以下有效,但需要重复 resource_delete

typedef std::unique_ptr<std::remove_pointer<ResourcePointer>::type, 
void(*)(ResourcePointer)> Resource_auto_pointer;

和后面的代码

Resource_auto_pointer resource(resource_new(), resource_delete);
...
Resource_auto_pointer res2 = { resource_new(), resource_delete };

我应该如何更改 typedef,以便编译器在每次需要时自动替换 resource_delete?我希望我的代码如下所示

Resource_auto_pointer2 resource (resource_new());
...
Resource_auto_pointer2 res2 = { resource_new() };

编译器应该以某种方式猜测它应该为类型为 Resource_auto_pointer2 的每个对象调用 resource_delete

我在 MS Visual Studio 2013 中工作。

更新我已经阅读了其他类似问题的答案。我不明白两件事。

  1. 为什么 std::function 不起作用?
  2. 我为什么要创建新类型,因为(大概)一切都已经说过了?

最佳答案

定义调用正确函数的函数对象:

struct resource_deleter
{
using pointer = std::remove_pointer<ResourcePointer>::type;
void operator()(ResourcePointer p) const { resource_delete(p); }
};

using res_ptr = std::unique_ptr<resource_deleter::pointer, resource_deleter>;

现在您不需要将删除器传递给 unique_ptr 构造函数,因为删除器可以是默认构造的并且会做正确的事情:

res_ptr p{ resource_new() };

关于c++ - 使用 typedef 为 std::unique_ptr 指定自定义默认删除器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32699390/

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