Une idée en C++ polymorphisme:
class Action
{
public:
virtual void revert(std::string& base) = 0;
};
class InsertAction : public Action
{
private:
int pos, len;
public:
InsertAction(int pos, std::string& base, const std::string& in) : len(in.size()), pos(pos)
{
base.insert(pos, in);
}
virtual void revert(std::string& base)
{
base.erase(pos,len);
}
};
int main()
{
std::string text("hello !");
std::cout << text << std::endl;
Action* action = new InsertAction(5, text, " world");
std::cout << text << std::endl;
action->revert(text);
std::cout << text << std::endl;
delete action;
}
Vous pouvez ensuite ajouter et pop Actions à partir d'une file d'attente LIFO que vous le souhaitez. C'est un exemple simple, vous pourriez également essayer de lier plus à une chaîne au lieu de toujours passer en tant que param, mais c'est à votre propre conception. Je sais que ce n'est pas "réel" différant, mais je pense que cette solution est plus proche du problème que de stocker des différences de chaînes générales.
Vous voudrez probablement un opérateur << (ostream &) 'et un' operator >> (istream &) 'pour la sérialisation. – MSalters
+1 J'aime ça. – Konrad
J'ai toujours pensé à ce modèle que le membre 'revert()' retournerait une 'Action', aussi? 'InsertAction' renverrait un' EraseAction' etc. (je ne suis pas sûr des avantages/inconvénients d'une manière contre l'autre, c'est juste que je n'ai jamais pensé de cette façon.) En tout cas, +1 de moi. – sbi