すべてのイベントは、ある種のキューを通過しますか?デフォルトでは、c ++にはこのようなキューはありません(Windows OSレベルのイベントキューがありますが、c ++-cliではすでに管理されて使用できない可能性があり、これが問題に密接にマッピングされているかどうかを示していません)、いくつかの可能性があります私が知らない他の構成。
中央キューがある場合は、イベントが通過するときにイベントをキャプチャし、各アクションを元に戻す方法を知っているだけです。中央キューが存在しない場合は、元にできる各関数を変更して、ある種の元にできるオブジェクトを作成し、それをある種の元にできるキューに保存する以外に簡単な方法はありません。
大きな中央作業キューのない純粋な.netまたはC++環境では、元に戻すためのメソッド/メンバー関数と、作業をやり直し/実行するためのメソッド/メンバー関数を実装する、エントリを元に戻すクラスを作成します。ただし、元に戻す機能の場合、これは.netデリゲートまたはacスタイルの関数ポインター、および引数のリストである可能性があります。アクションundo/redoクラスを作成する場合、それは、doおよびundo関数へのポインター/委任、および最初に呼び出されたときの引数のリストを格納するテンプレートまたはジェネリックである可能性があります。
これらを実行して、実行されたアクションを元に戻すことができます。それらはある種のキューコンテナに挿入されます。コンテナの種類は、順序を維持するほど長くは重要ではないようです。アプリケーションに最適なstd、.net、またはその他のコンテナを選択する必要があります。古いものは、不要になったときに破棄できます。実行時に、キューに最後に挿入されたエントリは、一貫性を維持するために削除する必要があります。
If you also need redo functionality, then your queue of actions done must be iterable, and it would be easiest to use the class that was and action had a method/member function that could undo/redo the desired actions. You would have and iterator, pointer, index or marker of some kind indicating how far back you have undone. Every time an undo is requested you must move the marker backward (earlier chronologically) and execute the undo command at that point in the queue. If a redo is requested then the current item indicated executes its redo instruction and then the iterator is advanced forward (chronologically) through the queue, or ignored (I presume) if you are at the forward-most item in the queue.
ディープエンドから抜け出したい場合は、アプリをアクションキューの中心に置くことができます。このアプローチを実装する機能を変更する必要はないかもしれません。ユーザーインターフェイス(私は、APIと同じくらい簡単にできると思います)を機能させ、アクション(実行と元に戻すことをサポートする)をキューに挿入してから、キューに実行を指示します。副作用がわかっていて元に戻せる場合は、既存の機能を変更する必要はありません。ただし、直接呼び出すのではなく、すべての呼び出し元を変更してアクションを実行する必要があります。また、元に戻す操作を行う対応する呼び出し元を作成する必要があります。