ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-27 18:05:56  阅读:280  来源: 互联网

标签:mupdf c c11 qt 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函数中.

标签:mupdf,c,c11,qt,unique-ptr
来源: https://codeday.me/bug/20190727/1556527.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有