C++ обещание/будущее: что вернуть из функции?

У меня есть функция, которая возвращает ссылку на std:: prom:

std::shared_ptr<std::promise<void>> play();

(Дополнительная информация: функция воспроизводит медиафайлы на каком-либо устройстве, а возвращаемое значение представляет, когда это воспроизведение завершено. Если воспроизведение вызывается второй раз, значение устанавливается на обещание, возвращенное в первый раз, и новое обещание создается и возвращается для этого второго вызова)

Затем вызывающий абонент может поймать значение и ждать в будущем:

auto this_future = play()->get_future();
this_future.wait();

Имеет ли смысл возвращать ссылку на обещание или я должен возвращать будущее вместо этого, чтобы вызывающая функция не вызывала get_future()?

Ответ 1

Поскольку реализация play() не размещена, я бы сказал, скорее всего, вы должны вернуть будущее, и функция должна работать с самим обещанием, скорее всего, в другом потоке. Обоснование этого дизайна проистекает из того факта, что обещание - конец производителя, а будущее - потребительский конец; поэтому функция произведет значение, задает его через экземпляр обещания, который уведомит будущее о том, что результат пришел через get.

Однако обратите внимание, что вам не нужно возвращать std::shared_ptr<std::future<T>> — просто std::future<T> будет работать отлично.