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