Farklı bir iş parçacığı üzerinde bir işlevi çağırmak ve sonucunu döndürmek için çok iş parçacıklı bir kod yazarak ve vaat/gelecek yazıyorum. simplicitly için, ben tamamen diş kısmını kaldırırız: Bu olmayan void
döndüren bir işlev için çok çalışırBir (muhtemelen geçersiz) söz yerine getirin
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();
}
. Ve geleceği elde eden iade bildirimi de void
için çalışır. Ama f
bir void
fonksiyonu, çünkü eğer sözünü edemez:
promise.set_value (f()); // hata: void ifadesi
geçersiz kullanımı sıralı void
durumunda değeri ayarlayarak bazı akıllı yolu var mı, yoksa sadece bir aşırı yükleme yaparak sahip olduğunu call_set_value(promise, f)
gibi bir yardımcı işlevi yazmak zorunda yapmak std::promise<R>
ve std::promise<void>
için?
Kendim yapmak için şablon becerilerine sahip değilim, ancak dönüş türünde muhtemelen SFINAE olabileceğini hissettim. – Borgleader
Arama tamamlanana kadar bekleyecekseniz, işlevi başka bir iş parçacığında çağırmanın amacı nedir? (Çağrıyı belirli bir * iş parçacığına göndermenin bariz durumunun engellenmesi.) – cdhowie
Neden düşük düzey vaat kullanıyorsunuz - sadece std :: future kullanıyor olabilirsiniz –