我有一些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中工作。
更新 我已经阅读了其他类似问题的答案。 我不明白两件事。
答案 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
函数的地址是常量。需要创建struct
或class
才能将其转换为类型。