Tôi đang viết một số mã đa luồng và sử dụng lời hứa/tương lai để gọi một hàm trên một chuỗi khác và trả về kết quả của nó. Để đơn giản, tôi sẽ xóa hoàn toàn phần luồng:Thực hiện lời hứa (có thể là void)
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();
}
Điều này phù hợp với mọi chức năng trả về không void
. Và tuyên bố trở lại nhận được tương lai cũng hoạt động cho void
. Nhưng tôi không thể thực hiện lời hứa nếu f
là một chức năng void
, bởi vì:
promise.set_value (f()); // lỗi: sử dụng không hợp lệ của khoảng trống biểu
Có một số cách thông minh của thiết lập các giá trị trong trường hợp void
nội dòng, hay tôi phải chỉ cần viết một hàm helper như call_set_value(promise, f)
rằng có quá tải cho std::promise<R>
và std::promise<void>
?
Tôi không có kỹ năng mẫu để tự mình làm, nhưng tôi có cảm giác rằng bạn có thể SFINAE trên loại trả về. – Borgleader
Điều gì chính xác là điểm gọi hàm trên một luồng khác nếu bạn chỉ đợi cho đến khi cuộc gọi được thực hiện? (Chặn các trường hợp rõ ràng của gửi cuộc gọi đến một * cụ thể * thread.) – cdhowie
Tại sao bạn sử dụng lời hứa mức thấp - bạn chỉ có thể sử dụng std :: tương lai –