#include<iostream>usingnamespacestd;structNumber{typedefintvalue_type;intn;voidset(intv){n=v;}intget()const{returnn;}};template<typenameBASE,typenameT=typenameBASE::value_type>structUndoable:publicBASE{typedefTvalue_type;Tbefore;voidset(Tv){before=BASE::get();BASE::set(v);}voidundo(){BASE::set(before);}};template<typenameBASE,typenameT=typenameBASE::value_type>structRedoable:publicBASE{typedefTvalue_type;Tafter;voidset(Tv){after=v;BASE::set(v);}voidredo(){BASE::set(after);}};typedefRedoable<Undoable<Number>>ReUndoableNumber;intmain(){ReUndoableNumbermynum;mynum.set(42);mynum.set(84);cout<<mynum.get()<<'\n';// 84mynum.undo();cout<<mynum.get()<<'\n';// 42mynum.redo();cout<<mynum.get()<<'\n';// back to 84}