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

时间:2015-09-21 15:45:10

标签: c++ c++11 visual-studio-2013

我有一些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中工作。

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

我找到了问题的答案。 std::unique_ptr需要实例化中的类型,而resource_delete函数的地址是常量。需要创建structclass才能将其转换为类型。