Пользовательский удалитель Shared_ptr - PullRequest
0 голосов
/ 06 марта 2020

Мне нужно сделать пользовательское удаление для shared_ptr. Я знаю, что это можно сделать аналогичным образом:

std::shared_ptr<SDL_Surface>(Surf_return_f(), MyDeleter);

Но я бы хотел сделать их в стиле моего пользовательского удалителя для unique_ptr:

struct SDL_Surface_Deleter {
    void operator()(SDL_Surface* surface) {
        SDL_FreeSurface(surface);
    }
};

using SDL_Surface_ptr = std::unique_ptr<SDL_Surface, SDL_Surface_Deleter>;

Есть ли способ сделать это?

Ответы [ 2 ]

5 голосов
/ 06 марта 2020

Похоже, вы пытаетесь определить псевдоним типа, который означает "std::shared_ptr с моим типом удаления". Этого нет, потому что std::shared_ptr имеет удаленное по типу средство удаления (оно не является частью типа).

Вместо этого вы можете создать пользовательскую версию make_shared:

* 1007. *
1 голос
/ 06 марта 2020

В отличие от unique_ptr, средство удаления для shared_ptr не является частью типа. Вы должны передать средство удаления конструктору shared_ptr.

. Вместо этого вы можете заключить его в функцию:

std::shared_ptr<SDL_Surface> make_shared_surface(SDL_Surface* surface)
{
    return std::shared_ptr<SDL_Surface>(surface, MyDeleter);
}

, а затем вызвать make_shared_surface(Surf_return_f()).

...