Let's start with the more difficult problem—how to implement a generic rollback class, a generic version of StorageGuard from the last section. The only difference between that and the cleanup class is that the cleanup is always active, but the rollback is canceled after the action is committed. If we have the conditional rollback version, we can always take out the condition check, and we get the cleanup version, so let's not worry about that for now.
In our example, the rollback is a call to the S.undo() method. To simplify the example, let's start with a rollback that calls a regular function, not a member function:
void undo(Storage& S) { S.undo(); }
Once the implementation is finished, the program should look something ...