我有一个C代码,并使用了一些资源。它具有如下功能
ResourcePointer resource_new(void);
void resource_delete(ResourcePointer *res);
这里ResourcePointer
是
typedef void * ResourcePointer;
我想创建一个typedef
for 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
type的每个对象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>;
现在,您无需将Deleter传递给unique_ptr
构造函数,因为Deleter可以是默认构造的,并且可以做正确的事情:
res_ptr p{ resource_new() };
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句