C++ - generic var manager
Veröffentlicht von KN4CK3R (20. Mai 2015)
class BaseVar
{
public:
BaseVar(std::string name)
: _name(std::move(name))
{
}
virtual ~BaseVar() = default;
const std::string& GetName() const
{
return _name;
}
virtual bool ReadFromStream(std::istream &is) = 0;
private:
std::string _name;
};
template<typename T>
class Var : public BaseVar
{
public:
Var(std::string name, T &&value)
: BaseVar(std::move(name)),
_value(std::move(value))
{
}
void SetValue(const T &value)
{
_value = value;
}
const T& GetValue() const
{
return _value;
}
virtual bool ReadFromStream(std::istream &is) override
{
is >> _value;
return (bool)is;
}
private:
T _value;
};
class VarManager
{
public:
template<typename T>
void AddVar(const std::string &name, T &&value)
{
if (_vars.find(name) != std::end(_vars))
{
throw;
}
_vars[name] = std::make_unique<Var<T>>(std::move(name), std::forward<T>(value));
}
BaseVar& GetVar(const std::string &name)
{
return *_vars.at(name);
}
bool ProcessCmd(std::istream &is)
{
std::string name;
if (!(is >> name))
{
return false;
}
auto it = _vars.find(name);
if (it == std::end(_vars))
{
return false;
}
return it->second->ReadFromStream(is);
}
private:
std::unordered_map<std::string, std::unique_ptr<BaseVar>> _vars;
};