Я пишу многопоточный код и используя обещание/будущее, чтобы вызвать функцию в другом потоке и вернуть ее результат. Для упрощения я полностью удаляю резьбовую часть:
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>?