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

wl2*_*776 3 c++ c++11 visual-studio-2013

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

ResourcePointer resource_new(void);
void resource_delete(ResourcePointer *res);
Run Code Online (Sandbox Code Playgroud)

这里ResourcePointer

typedef void * ResourcePointer;
Run Code Online (Sandbox Code Playgroud)

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

以下工作,但需要重复resource_delete

typedef std::unique_ptr<std::remove_pointer<ResourcePointer>::type, 
                            void(*)(ResourcePointer)> Resource_auto_pointer;
Run Code Online (Sandbox Code Playgroud)

然后在代码中

Resource_auto_pointer resource(resource_new(), resource_delete);
...
Resource_auto_pointer res2 = { resource_new(), resource_delete };
Run Code Online (Sandbox Code Playgroud)

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

Resource_auto_pointer2 resource (resource_new());
...
Resource_auto_pointer2 res2 = { resource_new() };
Run Code Online (Sandbox Code Playgroud)

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

我在 MS Visual Studio 2013 中工作。

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

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

Jon*_*ely 5

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

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>;
Run Code Online (Sandbox Code Playgroud)

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

res_ptr p{ resource_new() };
Run Code Online (Sandbox Code Playgroud)