QScopedPointer кастомный deleter

163
24 марта 2018, 16:47

Ничего не понимаю, каким образом мне передать в конструктор QScopedPointer функцию deleter'a, как я это делал в std::unique_ptr?

error: C2440: : невозможно преобразовать "initializer list" в "VlcInstancePtr"

struct VlcDeleter
{
    static inline void InstanceCleanup(libvlc_instance_t *&pointer)
    {
        libvlc_release(pointer);
        pointer = nullptr;
    }
    static inline void MediaPlayerCleanup(libvlc_media_player_t *&pointer)
    {
        libvlc_media_player_release(pointer);
        pointer = nullptr;
    }
    static inline void MediaCleanup(libvlc_media_t *&pointer)
    {
        libvlc_media_release(pointer);
        pointer = nullptr;
    }
};
typedef QScopedPointer<libvlc_instance_t, void(*)(libvlc_instance_t*)> VlcInstancePtr;
typedef QScopedPointer<libvlc_media_player_t, void(*)(libvlc_media_player_t*)> VlcMediaPlayerPtr;
typedef QScopedPointer<libvlc_media_t, void(*)(libvlc_media_t*)> VlcMediaPtr;

При таком раскладе, не могу инициализировать QScopedPointer таким образом:

vlcInstance_ = VlcInstancePtr(libvlc_new(0, 0), &VlcInstanceDeleter::cleanup);
vlcMediaPlayer_ = VlcMediaPlayerPtr(libvlc_media_player_new(vlcInstance_.data()), &VlcMediaPlayerDeleter::cleanup);
QString path = QString("path/to/");
vlcMedia_ = VlcMediaPtr(libvlc_media_new_path(vlcInstance_.data(), path.toUtf8().data()), &VlcMediaDeleter::cleanup);
Answer 1

QScopedPointer не умеет принимать deleter в качестве аргумента конструктора. Делетер передается в качестве 2-го параметра шаблона и не может быть переопределен в run-time. Сделайте так:

struct VlcDeleter
{
    static void cleanup(libvlc_instance_t *&pointer)
    {
        libvlc_release(pointer);
        pointer = nullptr;
    }
    static void cleanup(libvlc_media_player_t *&pointer)
    {
        libvlc_media_player_release(pointer);
        pointer = nullptr;
    }
    static void cleanup(libvlc_media_t *&pointer)
    {
        /libvlc_media_release(pointer);
        pointer = nullptr;
    }
};

typedef QScopedPointer<libvlc_instance_t    , VlcDeleter> VlcInstancePtr;
typedef QScopedPointer<libvlc_media_player_t, VlcDeleter> VlcMediaPlayerPtr;
typedef QScopedPointer<libvlc_media_t       , VlcDeleter> VlcMediaPtr;

Инициализация переменной:

VlcInstancePtr vlcInstance_( libvlc_new(0, 0) );
READ ALSO
C++ Ошибка exception from hresult 0x80041fe2 visual studio

C++ Ошибка exception from hresult 0x80041fe2 visual studio

При создании любого проекта, консольного, классического, вылезает такая ошибка, может кто сталкивался с такой проблемой? C# работает прекрасно,...

416
Передать анонимную функцию из Delphi в C++

Передать анонимную функцию из Delphi в C++

Здравствуйте, как можно передать анонимную функцию из Delphi в C++? Delphi:

193