fork download
  1. #include <iostream>
  2. #include <stack>
  3. #include <memory>
  4.  
  5. template<typename T>
  6. class Undo : public T {
  7. private:
  8. std::shared_ptr<std::stack<Undo>> history_ptr = std::make_shared<std::stack<Undo>>();
  9.  
  10. public:
  11. template <typename... Args>
  12. explicit Undo(const Args&... args): T(args ...) {}
  13.  
  14. void save() {
  15. history_ptr->push(*this);
  16. }
  17.  
  18. void undo() {
  19. if (!history_ptr->empty()) {
  20. *this = history_ptr->top();
  21. history_ptr->pop();
  22. }
  23. }
  24. };
  25.  
  26. class Foo {
  27. public:
  28. int a = 0;
  29. std::string s;
  30.  
  31. Foo(const int _a, std::string _s): a(_a), s(std::move(_s)) {}
  32. };
  33.  
  34. std::ostream &operator<<(std::ostream &out, const Foo &foo) {
  35. out << "Foo(" << foo.a << ", \"" << foo.s << "\")";
  36. return out;
  37. }
  38.  
  39. int main() {
  40. Undo<Foo> foo(1, "Hello World!");
  41.  
  42. foo.save();
  43. std::cout << "Save\t" << foo << std::endl;
  44.  
  45. foo.a = 6661313;
  46. foo.save();
  47. std::cout << "Save\t" << foo << std::endl;
  48.  
  49. foo.s = "Lakad Matataaag!";
  50. foo.save();
  51. std::cout << "Save\t" << foo << std::endl;
  52.  
  53. foo.a = 9000;
  54. foo.s = "Normalin, Normalin!";
  55. foo.save();
  56. std::cout << "Save\t" << foo << std::endl;
  57.  
  58. foo.a = 12345678;
  59. foo.s = "Da next lebel play!";
  60. std::cout << "Current\t" << foo << std::endl;
  61.  
  62. foo.undo();
  63. std::cout << "Undo\t" << foo << std::endl;
  64.  
  65. foo.undo();
  66. std::cout << "Undo\t" << foo << std::endl;
  67.  
  68. foo.undo();
  69. std::cout << "Undo\t" << foo << std::endl;
  70.  
  71. foo.undo();
  72. std::cout << "Undo\t" << foo << std::endl;
  73.  
  74. return 0;
  75. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
Save	Foo(1, "Hello World!")
Save	Foo(6661313, "Hello World!")
Save	Foo(6661313, "Lakad Matataaag!")
Save	Foo(9000, "Normalin, Normalin!")
Current	Foo(12345678, "Da next lebel play!")
Undo	Foo(9000, "Normalin, Normalin!")
Undo	Foo(6661313, "Lakad Matataaag!")
Undo	Foo(6661313, "Hello World!")
Undo	Foo(1, "Hello World!")