c – 如何为包含需要2个参数的c函数的unique_ptr类成员创建自定
我正在尝试使用mupdf创建一个程序(在Qt中),这将允许我将文档的对象列为列表,并允许我选择要呈现/不呈现的对象.由于Qt是c,我对它更熟悉,我试图在m类中包装mupdf中定义的结构.
现在我的问题是这个 – 你在mupdf中做的第一件事就是创建一个全局上下文,它传递给所有东西,包括清理和删除结构的函数. 我熟悉创建一个具有重载operator()的对象,很像: struct ContextDeleter { inline void operator()(fz_context* ctx) { fz_drop_context(ctx); } }; 然后我可以交给unique_ptr – std::unique_ptr<fz_context,ContextDeleter> ctxPtr; 我无法弄清楚的是如何用以下函数做同样的事情: fz_drop_page(ctx,page); 即: struct PageDeleter { inline void operator()(fz_context* ctx,fz_page* pg) { fz_drop_page(ctx,pg); } } 这显然是不正确的,但我正在努力实现. 如何为unique_ptr创建一个包含2个参数的删除器(在这种情况下是必要的上下文指针)?有没有办法让unique_ptr知道删除页面的上下文指针(在本例中)?或者(我曾经想过)我需要创建一个包装unique_ptr的东西,这样我就可以把它上传给上下文以便稍后删除(还没有完全考虑过). 我在这里看到了这些例子: How do I use a custom deleter with a std::unique_ptr member? 和 Wrapping of C-code with a unique_ptr and custom deleter 但我无法弄清楚如何使它们在我的情况下工作. 解决方法
将fz_context *存储在删除器中,并将该删除器的实例传递给包含fz_page的unique_ptr *
struct PageDeleter { explicit PageDeleter(fz_context *ctx) : ctx(ctx) {} void operator()(fz_page* page) const { fz_drop_page(ctx,page); } fz_context *ctx; }; 将unique_ptr构造为 fz_context *ctx = // get the fz_context fz_page *page = // get the fz_page PageDeleter page_del(ctx); std::unique_ptr<fz_page,PageDeleter> pagePtr(page,page_del); 为方便起见,您可以将所有这些包装在make_unique_fz_page函数中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |