我有一个 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 中工作。
更新
我已经阅读了其他类似问题的答案。
我不明白两件事。
最佳答案
定义一个调用正确函数的函数对象:
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/