1

我有一个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,这将导致错误。

请建议。

4

0 回答 0