我知道我可以使用boost::variant
并避免不得不问这个问题。但是使用boost::variant
涉及到很多丑陋的代码。尤其是游客很乱。所以,事不宜迟……
我编写了以下模板类来实现对柯里化函数的惰性求值。(有关整个片段,请参阅我之前的问题。)
template <typename> class curry;
template <typename _Res>
class curry< _Res() >
{
public:
typedef std::function< _Res() > _Fun;
typedef _Res _Ret;
private:
_Fun _fun;
public:
explicit curry (_Fun fun)
: _fun(fun) { }
operator _Ret ()
{ return _fun(); }
};
所以我想更新它以包括记忆。从概念上讲,它非常简单。首先,我必须更换:
private:
_Fun _fun;
public:
explicit curry (_Fun fun)
: _fun(fun) { }
和:
private:
bool _evaluated; // Already evaluated?
union
{
_Fun _fun; // No
_Res _res; // Yes
};
public:
explicit curry (_Fun fun)
: _evaluated(false), _fun(fun) { }
explicit curry (_Res res)
: _evaluated(true), _res(res) { }
但是还剩下两件事。首先,我必须更新operator _Ret
,如果它执行惰性求值,那么结果实际上会被记忆。其次,我必须添加一个析构函数,以便根据 的值_evaluated
,要么 要么_fun
被_res
销毁。这是我不太确定如何做事的地方。
_fun
首先,这是替换为的正确方法_res
吗?如果没有,我该怎么做?
operator _Ret ()
{
if (!_evaluated) {
_Fun fun = _fun;
// Critical two lines.
_fun.~_Fun();
_res._Res(fun());
_evaluated = true;
}
return _res;
}
其次,这是选择性破坏的正确方法_fun
还是_res
?如果没有,我该怎么做?
~curry ()
{
if (_evaluated)
_res.~_Res();
else
_fun.~_Fun();
}