Задержка оценки выражения с использованием 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, что приведет к ошибке.

Пожалуйста, предложите.

0 ответов

Другие вопросы по тегам