OldSchoolHack

Registrieren / Anmelden Deutsch

C++ - generic var manager

Veröffentlicht von (20. Mai 2015)
Beschreibung
Benutzung so:

CPP Code:
  1. int main()
  2. {
  3.     VarManager vm;
  4.     vm.AddVar("int", 0);
  5.     vm.AddVar("float", 0.5f);
  6.     vm.AddVar("string", std::string("test"));
  7.  
  8.     auto &v = static_cast<Var<int>&>(vm.GetVar("int"));
  9.     int i = v.GetValue(); //0
  10.  
  11.     std::stringstream line("int 4");
  12.     vm.ProcessCmd(line);
  13.  
  14.     i = v.GetValue(); //4
  15.  
  16.     return 0;
  17. }
  1. class BaseVar
  2. {
  3. public:
  4. BaseVar(std::string name)
  5. : _name(std::move(name))
  6. {
  7.  
  8. }
  9. virtual ~BaseVar() = default;
  10.  
  11. const std::string& GetName() const
  12. {
  13. return _name;
  14. }
  15.  
  16. virtual bool ReadFromStream(std::istream &is) = 0;
  17.  
  18. private:
  19. std::string _name;
  20. };
  21.  
  22. template<typename T>
  23. class Var : public BaseVar
  24. {
  25. public:
  26. Var(std::string name, T &&value)
  27. : BaseVar(std::move(name)),
  28. _value(std::move(value))
  29. {
  30.  
  31. }
  32.  
  33. void SetValue(const T &value)
  34. {
  35. _value = value;
  36. }
  37.  
  38. const T& GetValue() const
  39. {
  40. return _value;
  41. }
  42.  
  43. virtual bool ReadFromStream(std::istream &is) override
  44. {
  45. is >> _value;
  46. return (bool)is;
  47. }
  48.  
  49. private:
  50. T _value;
  51. };
  52.  
  53. class VarManager
  54. {
  55. public:
  56. template<typename T>
  57. void AddVar(const std::string &name, T &&value)
  58. {
  59. if (_vars.find(name) != std::end(_vars))
  60. {
  61. throw;
  62. }
  63.  
  64. _vars[name] = std::make_unique<Var<T>>(std::move(name), std::forward<T>(value));
  65. }
  66.  
  67. BaseVar& GetVar(const std::string &name)
  68. {
  69. return *_vars.at(name);
  70. }
  71.  
  72. bool ProcessCmd(std::istream &is)
  73. {
  74. std::string name;
  75. if (!(is >> name))
  76. {
  77. return false;
  78. }
  79.  
  80. auto it = _vars.find(name);
  81. if (it == std::end(_vars))
  82. {
  83. return false;
  84. }
  85.  
  86. return it->second->ReadFromStream(is);
  87. }
  88.  
  89. private:
  90. std::unordered_map<std::string, std::unique_ptr<BaseVar>> _vars;
  91. };
Schlagwörter Das Snippet wurde getaggt mit: c++, cvar, generic, c++14
Zu diesem Snippet existieren keine Kommentare.
Kommentar hinzufügen