gpt4 book ai didi

c++ - 如何为包装需要 2 个参数的 c 函数的 unique_ptr 类成员创建自定义删除器?

转载 作者:太空狗 更新时间:2023-10-29 20:11:11 26 4
gpt4 key购买 nike

我正在尝试使用 mupdf 创建一个程序(在 Qt 中),它允许我将文档的对象列为列表,并允许我选择要呈现/不呈现的对象。由于 Qt 是 C++,而且我对它更熟悉,所以我尝试将 mupdf 中定义的结构包装在 C++ 类中。

现在我的问题是 - 你在 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 函数中。

关于c++ - 如何为包装需要 2 个参数的 c 函数的 unique_ptr 类成员创建自定义删除器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34519470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com