Giả sử tôi có hai chức năng mà trở về tương lai:chức năng Kết hợp mà trở về tương lai
std::future<T> foo(int);
std::future<U> bar(T const &);
Tôi muốn kết hợp hai chức năng để một chức năng mà phải mất một int
như tham số và trả về một std::future<U>
. Tôi nên viết hàm này như thế nào? Có thể khái quát thành phần hàm cho các hàm trả về tương lai không?
std::future<U> foobar1(int x)
{
auto foo_x = foo(x);
return bar(foo_x.get());
}
Chức năng này sẽ chặn cho đến khi tương lai trả lại foo
xong, phải không? Điều này rõ ràng không phải là những gì tôi muốn.
std::future<U> foobar2(int x)
{
return std::async([=]()
{
auto foo_x = foo(x);
return bar(foo_x.get()).get();
});
}
Nó cảm thấy ngớ ngẩn để gọi get()
về tương lai được trả về bởi bar
chỉ để có nó biến thành một tương lai mới của std::async
std::future<U> foobar3(int x)
{
return foo(x).then([](std::future<T> f)
{
return bar(f.get()).get();
};
}
Ở đây, một lần nữa tôi phải gọi get()
về tương lai được trả về bởi bar
nếu không tôi sẽ có một số future<future<U>>
. Đây có phải là cách tiếp cận chính xác không?