Я пытаюсь использовать mupdf для создания программы (в Qt), которая позволит мне перечислить объекты документа в виде списка и позволить мне выбирать, какие объекты визуализировать/не отображать. Поскольку Qt является C++, и мне более комфортно с ним, я пытаюсь обернуть структуры, определенные в mupdf в классах C++.Как создать пользовательский делектор для члена класса unique_ptr, который обертывает c-функцию, которая требует 2 аргумента?
Прямо сейчас моя проблема в этом - одна из первых вещей, которые вы делаете в 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);
ie:
struct PageDeleter
{
inline void operator()(fz_context* ctx, fz_page* pg)
{
fz_drop_page(ctx, pg);
}
}
Это, очевидно, неверно, но это то, чего я пытаюсь достичь.
Как создать deleter для 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
, но я не могу понять, как заставить их работать в моем случае.
Unfortunetally, C++ не имеет понятия аргументов деструкторов: если это так, вы могли бы уменьшить состояние ваших уникальных PTRS налетом. Это была бы странная, сложная языковая функция, которая добавила бы methinks. – Yakk
OP ищет реализацию 'PageDeleter', но вместо этого в вашем примере реализован' ContextDeleter', для которого OP уже имеет рабочую реализацию. Я обновил ваш ответ, чтобы поменять значения вокруг. –