Я пишу многопоточный код и используя обещание/будущее, чтобы вызвать функцию в другом потоке и вернуть ее результат. Для упрощения я полностью удаляю резьбовую часть:
template <typename F>
auto blockingCall(F f) -> decltype(f())
{
std::promise<decltype(f())> promise;
// fulfill the promise
promise.set_value(f());
// block until we have a result
return promise.get_future().get();
}
Это отлично работает для любой функции, которая возвращает не void
. И выражение return, получающее будущее, также работает для void
. Но я не могу выполнить обещание, если f
является функцией void
, потому что:
promise.set_value (е());// ошибка: недопустимое использование выражения void
Есть ли какой-нибудь умный способ установки значения в случае void
в строке, или мне нужно просто написать вспомогательную функцию типа call_set_value(promise, f)
, которая имеет перегрузки для std::promise<R>
и std::promise<void>
?