我有一个 C 代码,使用一些资源。它有这样的功能

ResourcePointer resource_new(void);
void resource_delete(ResourcePointer *res);
ResourcePointer 在哪里
typedef void * ResourcePointer;

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

以下工作,但需要重复 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_delete 类型的每个对象调用 Resource_auto_pointer2

我在 MS Visual Studio 2013 中工作。

更新
我已经阅读了其他类似问题的答案。
我不明白两件事。
  • 为什么 std::function 不起作用?
  • 为什么我要创建新类型,因为(大概)一切都已经说了?
  • 最佳答案

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

    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/

    10-11 16:55