Можно ли проверить, закончен ли std::future или нет? Насколько я могу судить, единственный способ сделать это - вызвать wait_for с нулевой продолжительностью и проверить, является ли статус ready или нет, но есть ли лучший способ?
Получить статус std:: future
Ответ 1
Вы правы, и, помимо вызова wait_until с временем в прошлом (что эквивалентно), нет лучшего способа.
Вы всегда можете написать небольшую обертку, если хотите более удобный синтаксис:
template<typename R>
bool is_ready(std::future<R> const& f)
{ return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
N.B. если функция отложена, это никогда не вернет true, поэтому лучше проверить wait_for непосредственно в том случае, если вы можете запускать отложенную задачу синхронно по прошествии определенного времени или при низкой загрузке системы.
Ответ 2
Здесь есть функция member_ready в работах для std:: future. Тем временем, реализация VC имеет член _Is_ready().
Ответ 3
Моя первая ставка заключалась бы в вызове wait_for с длительностью 0 и проверке кода результата, который может быть одним из future_status::ready, future_status::deferred или future_status::timeout.
В cppreference они утверждают, что valid() проверяет, доступен ли результат, но стандарт говорит, что valid() вернет true если *this относится к общему состоянию, независимо от того, готово ли это состояние или нет.