|
|

楼主 |
发表于 2007-2-25 13:15:00
|
显示全部楼层
Re:大家新年好,有个模板的问题想请教
这是目前改动后的结果,虽然解决了一般问题,可离我的目标还有一步.就是没法子使用返回类型了,虽然目前的确是用不上.
//-----------------------------------------------------------------------------------------
//基类
//-----------------------------------------------------------------------------------------
class FnCall
{
public:
virtual void Run() = 0;
};
//-----------------------------------------------------------------------------------------
//无参的函数指针
//-----------------------------------------------------------------------------------------
template<class R>
class NormalFnNon:public FnCall
{
public:
explicit NormalFnNon( R (*p)() ):fp(p){}
void Run() {(*fp)();}
private:
R (*fp)();
};
template<class R>
NormalFnNon<R>* CreateNFNon( R (*p)() )
{
return new NormalFnNon<R>(p);
}
//-----------------------------------------------------------------------------------------
//一个参数的函数指针
//-----------------------------------------------------------------------------------------
template<class R,class A>
class NormalFnOne:public FnCall
{
public:
explicit NormalFnOne( R (*p)(A),const A& a )
:_fp(p),_a(a){}
void Run() {(*_fp)(_a);}
private:
R (*_fp)(A);
A _a;
};
template<class R,class A>
NormalFnOne<R,A>* CreateNFOne( R (*p)(A),const A& a )
{
return new NormalFnOne<R,A>(p,a);
}
//-----------------------------------------------------------------------------------------
//实现
//-----------------------------------------------------------------------------------------
class RUdo
{
public:
bool CanUndo()
{
return !_fn_undo.empty();
}
bool CanRedo()
{
return !_fn_redo.empty();
}
bool Redo()
{
if( _fn_redo.empty()==true ) return false;
_fn_redo.top()._old_call->Run();
_fn_undo.push(_fn_redo.top());
_fn_redo.pop();
return true;
}
bool Undo()
{
if( _fn_undo.empty()==true ) return false;
_fn_undo.top()._opp_call->Run();
_fn_redo.push(_fn_undo.top());
_fn_undo.pop();
return true;
}
template<class R>
void Push( R(*f)() )
{
clear_temp();
add_operator( CreateNFNon(f) );
}
template<class R,class A>
void Push( R(*f)(A),const A& a )
{
clear_temp();
add_operator( CreateNFOne(f,a) );
}
private:
void clear_temp()
{
while(_fn_redo.empty()==false)
{
_fn_redo.pop();
}
}
void add_operator(FnCall* call)
{
if(_fn_undo.empty()==true || _fn_undo.top()._opp_call!=0 )
{
Mutex mutex;
mutex._old_call = call;
_fn_undo.push(mutex);
}
else
{
_fn_undo.top()._opp_call = call;
}
}
struct Mutex //相反的操作
{
Mutex():_old_call(0),_opp_call(0){}
FnCall* _old_call;
FnCall* _opp_call;
};
std::stack<Mutex> _fn_undo; //函数调用
std::stack<Mutex> _fn_redo; //临时的函数调用
};
|
|