Задержка оценки выражения с использованием std::future
У меня есть класс под названием Expr
который использует методологию шаблонов выражений, которую можно использовать для построения выражений, подобных этому:
Expr<int,Mat<int>> v(Mat<int>(10,10));
v(0,0)*3 + v(2,1)*v(1,2) >> val;
Выражение оценивается, когда operator>>(T& val)
называется, т. е. когда >>
встречается. Допустим, что eval
функция вычисляет выражение и вызывается внутри operator>>(T& val)
, который определен в Expr
учебный класс:
void operator>>(T& val) { eval(val); }
Теперь я хочу еще больше отложить оценку, пока пользователю не понадобится результат, введя фьючерсы. Итак, я модифицирую operator>>
как:
void operator>>(T& val) {
handle_ = std::async(std::launch::deferred, [&val,this]() { eval(val);});
}
Вопрос в том, как / где объявить std::future<void> handle_
так что мы можем легко получить к нему доступ позже. В настоящее время это объявлено глобально, и мне это не нравится. В идеале я хотел бы иметь будущее в качестве члена Expr
класс, такой, что я могу сделать это:
Expr<int,Mat<int>> v(Mat<int>(10,10));
v(0,0)*3 + v(2,1)*v(1,2) >> val;
... // other stuff
v.get(); // now, val can be accessed
Вот, v.get()
будет внутренне звонить handle_.get()
, Однако это неверно, так как объект, который вызвал operator>>
нигде не хранится, а я пытаюсь позвонить get()
на отдельном случае Expr
, что приведет к ошибке.
Пожалуйста, предложите.