加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何为包含需要2个参数的c函数的unique_ptr类成员创建自定

发布时间:2020-12-16 10:00:56 所属栏目:百科 来源:网络整理
导读:我正在尝试使用mupdf创建一个程序(在Qt中),这将允许我将文档的对象列为列表,并允许我选择要呈现/不呈现的对象.由于Qt是c,我对它更熟悉,我试图在m类中包装mupdf中定义的结构. 现在我的问题是这个 – 你在mupdf中做的第一件事就是创建一个全局上下文,它传递给
我正在尝试使用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函数中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读