我已经通过对定制删除这么多的问题读取shared_ptr和unique_ptr,以及两者之间的差异.但是,我仍然没有找到这个问题的任何明确答案:
如何最好地创建一个充当shared_ptr自定义删除器的类型,类似于删除器如何unique_ptr作为类型定义的一部分?
为了unique_ptr使用,我使用了一个删除类,它处理各个类型的删除(为简洁起见,它只限于两种类型):
struct SDL_Deleter {
void operator()( SDL_Surface* ptr ) { if (ptr) SDL_FreeSurface( ptr );}
void operator()( SDL_RWops* ptr ) { if (ptr) SDL_RWclose( ptr );}
};
using SurfacePtr = std::unique_ptr<SDL_Surface, SDL_Deleter>;
using RWopsPtr = std::unique_ptr<SDL_RWops, SDL_Deleter>;
Run Code Online (Sandbox Code Playgroud)
哪个可以用于类似的东西
SurfacePtr surface(IMG_Load("image.png"));
Run Code Online (Sandbox Code Playgroud)
并呼吁SDL_FreeSurface毁灭.
这一切都很好.但是,如何实现同样的目标shared_ptr呢?其类型定义为
template< class T > class shared_ptr;
Run Code Online (Sandbox Code Playgroud)
并且提供自定义删除器的方法是通过构造函数.shared_ptr包装器的用户需要知道包装了哪个指针类型以及应该如何删除该指针,这感觉不对.实现与上述unique_ptr示例相同类型的使用的最佳方式是什么.
换句话说,我最终可能会:
SurfaceShPtr surface(IMG_Load("image.png"));
Run Code Online (Sandbox Code Playgroud)
而不是像
SurfaceShPtr surface(IMG_Load("image.png"),
[=](SDL_Surface* ptr){SDL_FreeSurface(ptr);});
Run Code Online (Sandbox Code Playgroud)
或者,稍微好一些
SurfaceShPtr surface(IMG_Load("image.png"), …Run Code Online (Sandbox Code Playgroud)