Можно вспомнить hpx::future
(очень похоже, если не идентично std::experimental::future
, см. https://en.cppreference.com/w/cpp/experimental/future) - это однократный конвейер между анонимным производителем и потребителем. Он не представляет задачусам по себе, но только полученный результат (который, возможно, еще не был вычислен).
Таким образом, «пересчет» будущего (как вы его выразили) может означать только повторную инициализацию будущего от асинхронного поставщика (hpx::async
,future<>::then
и т. Д.).
hpx::future<int> f = hpx::async([]{ return 42; });
hpx::future<int> f2 = f.then(
[](hpx::future<int> r)
{
// this is guaranteed not to block as the continuation
// will be called only after `f` has become ready (note:
// `f` has been moved-to `r`)
int result = r.get();
// 'reinitialize' the future
r = hpx::async([]{ return 21; });
// ...do things with 'r'
return result;
});
// f2 now represents the result of executing the chain of the two lambdas
std::cout << f2.get() << '\n'; // prints '42'
Я не уверен, что это ответит на ваш вопрос и почему вы хотели бы это сделать, но вот, пожалуйста.