fork download
  1. #include <memory>
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. #include <array>
  6. using namespace std;
  7.  
  8. struct GameState{
  9. virtual string info() const = 0;
  10. };
  11. string GameState::info() const{
  12. return "GameState.info: ";
  13. }
  14. typedef shared_ptr<GameState> state_ptr;
  15.  
  16. struct MenuState : GameState{
  17. string info() const{ return GameState::info() + "Menu"; }
  18. };
  19.  
  20. struct PlayState : GameState{
  21. string info() const{ return GameState::info() + "Play"; }
  22. };
  23.  
  24. template<class T>
  25. state_ptr create(){ return shared_ptr<GameState>(new T()); }
  26. typedef state_ptr (*create_fptr)();
  27.  
  28. class Manager{
  29. private:
  30. state_ptr m_state;
  31. public:
  32. state_ptr state(){ return m_state; }
  33. state_ptr state(string name){
  34. static map<string, create_fptr> create_funcs = {
  35. {{"Menu"}, {create<MenuState>}},
  36. {{"Play"}, {create<PlayState>}}
  37. };
  38. return m_state = create_funcs[name]();
  39.  
  40. }
  41. state_ptr state(state_ptr state){
  42. return m_state = state;
  43. }
  44. };
  45.  
  46. int main(){
  47. Manager m;
  48.  
  49. array<string, 2> names =
  50. { "Menu", "Play" };
  51. array<state_ptr, 2> objects =
  52. { create<PlayState>(), create<MenuState>() };
  53.  
  54. for(auto name : names)
  55. cout << m.state(name)->info() << endl;
  56. for(auto object : objects)
  57. cout << m.state(object)->info() << endl;
  58.  
  59. return 0;
  60. }
Success #stdin #stdout 0s 3436KB
stdin
Standard input is empty
stdout
GameState.info: Menu
GameState.info: Play
GameState.info: Play
GameState.info: Menu