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>
будет работать отлично.