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