2015-04-15 18 views
12

Tôi có một hàm trả về một tham chiếu đến một std :: lời hứa:C + + lời hứa/tương lai: Trả về từ chức năng nào?

std::shared_ptr<std::promise<void>> play(); 

(Xem thêm thông tin:. Chức năng đóng phương tiện truyền thông trên một số thiết bị và giá trị trả về thể hiện khi chơi này hoàn tất Nếu vở kịch là gọi lần thứ hai, một giá trị được thiết lập trên lời hứa trở lại lần đầu tiên, và một lời hứa mới được tạo ra và được trả về cho cuộc gọi thứ hai này)

người gọi sau đó có thể nắm bắt những giá trị và chờ đợi vào tương lai:

auto this_future = play()->get_future(); 
this_future.wait(); 

Doe s có ý nghĩa để trở về một tham chiếu đến lời hứa, hoặc tôi nên quay trở lại tương lai thay vào đó, để các chức năng gọi điện thoại không phải gọi get_future()?

+0

Có std :: promise/std :: tương lai trong std :: shared_ptr có thể là vấn đề (Nó phá vỡ khái niệm không sao chép của std :: promise/std :: future) –

+0

Đồng ý; shared_ptr thực sự cần thiết để giải quyết các vấn đề không sao chép này, vì tôi muốn lưu trữ chúng trong một bộ sưu tập và trả về chúng từ một hàm. Tuy nhiên, tôi không thể thấy nơi này sẽ gây ra vấn đề. –

+1

@ScottM: Bạn cũng có thể 'std :: move' tương lai nếu bạn muốn lưu trữ sau đó trong một bộ sưu tập, nói' std :: vector > '. – Nawaz

Trả lời

9

Vì việc triển khai play()không phải được đăng, tôi muốn nhiều khả năng bạn nên quay lại tương lai và chức năng sẽ hoạt động với chính lời hứa, rất có thể trong một chuỗi khác. Lý do cho thiết kế này bắt nguồn từ thực tế là lời hứa là kết thúc của nhà sản xuất và tương lai là tiêu dùng cuối cùng — do đó chức năng sẽ tạo ra một giá trị, đặt nó qua thể hiện lời hứa, sẽ thông báo cho tương lai rằng kết quả đã đến qua get.

Tuy nhiên, lưu ý rằng, bạn không phải trả lại std::shared_ptr<std::future<T>> — chỉ std::future<T> sẽ hoạt động tốt.

Các vấn đề liên quan