Std:: future как параметр функции С++
Рассмотрим следующий код
void printPromised(std::future<int> f)
{
std::cout << f.get() << std::endl;
}
int main()
{
printPromised(std::async(std::launch::async, [](){ return 8; })); // This works
auto f = std::async(std::launch::async, [](){ return 8; });
printPromised(f); // This won't work
}
В нем говорится: "Это удаленная функция". Почему это? Далее мне нужно передать тот же обещанный результат, который std::async
сгенерирован; для нескольких пользователей. Это означает, что когда кто-то вызывает "getter", мне нужно передать тот же результат (мне не нужно генерировать результат с помощью std::async
, если он уже сгенерирован), а также мне нужен механизм блокировки, который std::future::get
есть.
Ответы
Ответ 1
Может быть только одно будущее. У вас не может быть нескольких копий одного и того же будущего. Поэтому вам нужно передать право собственности на будущее на функцию:
printPromised(std::move(f));
// ^^^^^^^^^^^^
Если вам действительно нужен общий доступ к будущему, вы можете построить shared_future
из обычного будущего, вызвав функцию-член share()
; это ведет себя аналогично общему указателю:
auto sf = std::async(std::launch::async, [](){ return 8; }).share();
Теперь sf
можно скопировать, и все копии ждут того же результата, то есть вызовы wait()
на всех копиях могут блокироваться и синхронизироваться с готовностью к результату.
Ответ 2
Вот что я придумал после этого обсуждения.
#include <future>
typedef std::shared_future<int> SharedFutureInt;
struct Object
{
SharedFutureInt m_promised;
bool isAssigned;
Object() : isAssigned(false)
{
}
SharedFutureInt getObjects()
{
if (isAssigned)
{
return m_promised;
}
m_promised = std::async(std::launch::async, [](){ return 8; });
isAssigned = true;
return m_promised;
}
};
int main()
{
Object obj;
int a = obj.getObjects().get();
int b = obj.getObjects().get();
int c = obj.getObjects().get();
return 0;
}