当然。 简略地将<条码>sync<T>std: 功能和lt;T()> 归还一个援引<条码>func()条码>的未来。 你们赢得了任何礼仪,但Adrend实际上并没有保证这一功能会同步运作,从而不会成为一个问题。
如果你能够查阅一个专门面向工作的阅读图书馆,你当然也可以这样做。
然而,注意到,仓储例外情况无法在港口内执行;这要求C++执行提供额外支助,除非你能够限制支持具有多变性功能的例外情况。 见。 详情请见。
最终执行可能看起来像这样(未测试):
// NOTE - we assume a SINGLE THREADED environment
template<typename T>
class myfuture_detail {
mutable boost::variant<T, boost::function<T()> > val;
public:
myfuture_detail(const boost::function<T()> &f)
: val(f) { }
const T &get() const {
if (T *t = boost::get<T>(&val)) {
return *t;
} else {
boost::function<T()> f = *boost::get<boost::function<T> >(&val);
val = f();
T *t = boost::get<T>(&val);
assert(t);
return *t;
}
}
};
template<typename T>
class myfuture {
boost::shared_ptr<myfuture_detail<T> > ptr;
public:
myfuture(const boost::function<T()> &f)
: ptr(boost::make_shared<myfuture_detail<T> >(f))
{}
myfuture() { }
const T &get() const {
return ptr->get();
}
};