我正在尝试使用mupdf创建一个程序(在Qt中),这将允许我将文档的对象列为列表,并允许我选择要呈现/不呈现的对象.由于Qt是c ++,而且我对它更熟悉,我试图在m ++中用C++类包装结构.
现在我的问题是这个 - 你在mupdf中做的第一件事就是创建一个全局上下文,它传递给所有东西,包括清理和删除结构的函数.
我熟悉创建一个有重载的对象,operator()
很像:
struct ContextDeleter { inline void operator()(fz_context* ctx) { fz_drop_context(ctx); } };
然后我可以交给unique_ptr
-
std::unique_ptrctxPtr;
我无法弄清楚的是如何用以下函数做同样的事情:
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
所以我可以把它上传给上下文以便稍后删除(还没有完全考虑过).
我在这里看到了这些例子:
如何将自定义删除器与std :: unique_ptr成员一起使用?
和
使用unique_ptr和自定义删除器包装C代码
但我无法弄清楚如何使它们在我的情况下工作.
存储fz_context *
在删除器中,并将该删除器的实例传递给unique_ptr
保存器fz_page *
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
as
fz_context *ctx = // get the fz_context fz_page *page = // get the fz_page PageDeleter page_del(ctx); std::unique_ptrpagePtr(page, page_del);
make_unique_fz_page
为方便起见,您可以将所有这些包装在一个函数中.