当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何为包含需要2个参数的ac函数的unique_ptr类成员创建自定义删除器?》经验,为你挑选了1个好方法。

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

现在我的问题是这个 - 你在mupdf中做的第一件事就是创建一个全局上下文,它传递给所有东西,包括清理和删除结构的函数.

我熟悉创建一个有重载的对象,operator()很像:

struct ContextDeleter
{
    inline void operator()(fz_context* ctx)
    {
        fz_drop_context(ctx);
    }
};

然后我可以交给unique_ptr-

std::unique_ptr 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所以我可以把它上传给上下文以便稍后删除(还没有完全考虑过).

我在这里看到了这些例子:

如何将自定义删除器与std :: unique_ptr成员一起使用?

使用unique_ptr和自定义删除器包装C代码

但我无法弄清楚如何使它们在我的情况下工作.



1> Praetorian..:

存储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_ptras

fz_context *ctx = // get the fz_context
fz_page *page = // get the fz_page

PageDeleter page_del(ctx);
std::unique_ptr pagePtr(page, page_del);

make_unique_fz_page为方便起见,您可以将所有这些包装在一个函数中.

推荐阅读
Life一切安好
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有