Может ли std :: make_unique принимать выходные данные функции в качестве аргумента? - PullRequest
1 голос
/ 03 мая 2019

Есть ли способ использовать make_unique и передать выходные данные функции в качестве параметра?

auto loadedSurface1 = std::unique_ptr<SDL_Surface,SurfaceDeleter>(IMG_Load(path.c_str()));
auto loadedSurface2 = std::make_unique<SDL_Surface, SurfaceDeleter>();
loadedSurface2.reset(IMG_Load(path.c_str()));
auto loadedSurface3 = std::make_unique<SDL_Surface, SurfaceDeleter>(IMG_Load(path.c_str())));

SurfaceDeleter является функтором.

ЗагруженныйSurface1 и ЗагруженныйSurface2 оба работают отлично. ЗагруженныйSurface3 не выполняется (ни один экземпляр перегруженной функции не соответствует списку аргументов)

Если нет никакого способа заставить загруженныйSurface3 работать, рекомендуется загруженныйSurface2 вместо загруженногоSurface1, потому что он использует make_unique?

1 Ответ

4 голосов
/ 03 мая 2019

Есть ли способ использовать make_unique и передать выходные данные функции в качестве параметра?

std::make_unique<T> принимает аргументы конструктора для создания нового T. Не требуется T* для существующего T.

Кроме того, вы не можете указать таким образом удалитель .

Вы имеете в виду просто:

std::unique_ptr<SDL_Surface, SurfaceDeleter> loadedSurface3{IMG_Load(path.c_str())};

рекомендуется загружен Surface2, а не загружен, потому что он использует make_unique? * 1020

Я не вижу там никакой пользы. Все, чего вы достигли, это разделите вашу конструкцию на две строки и потеряете удалитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...