fork download
  1. #include <iostream>
  2. #include <memory>
  3. #include <functional>
  4.  
  5. using namespace std;
  6.  
  7. struct Trace
  8. {
  9. Trace() : src("()") { cout << "X()\n"; }
  10. Trace(Trace const &) : src("(&)") { cout << "X(X&)\n"; }
  11. Trace(Trace&&) : src("(&&)") { cout << "X(X&&)\n"; }
  12. ~Trace() { cout << "~X" << src << "\n"; }
  13. void operator=(Trace const &) { cout << "X::op=(X&)\n"; }
  14. void operator=(Trace &&) { cout << "X::op=(X&&)\n"; }
  15.  
  16. std::string src;
  17. };
  18.  
  19. struct Game
  20. {
  21. static std::function<void()> later;
  22.  
  23. static void idle( std::function<void()> func, int x )
  24. { std::cout << "x = " << x << "\n"; later = func; }
  25.  
  26. static void cleanup() { if ( later ) later(); }
  27. };
  28.  
  29. struct Player: Trace, std::enable_shared_from_this<Player>
  30. {
  31. void death() { std::cout << "player.death\n"; }
  32. void kill() { Game::idle( std::bind(&Player::death, shared_from_this()), 48 ); }
  33. Player() {}
  34. };
  35.  
  36. int main()
  37. {
  38. {
  39. auto p = std::make_shared<Player>();
  40. p->kill();
  41. }
  42. std::cout << "beginning cleanup\n";
  43. Game::cleanup();
  44. }
  45.  
  46. std::function<void()> Game::later;
  47.  
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
X()
x = 48
beginning cleanup
player.death
~X()