我正在尝试使用C ++中的数据管理器框架,它会定期(当调用Manager :: checkout()时)保存当前状态。这将是允许应用程序在系统错误后重新启动的系统的基础。
我们的想法是拥有一个名为Manager的单例类,它将所有变量保存在其中,用户只需通过执行
创建一个新的托管变量int& i = Manager::get().make<int>("variable_id");
double& e = Manager::get().make<double>("other_variable_id");
我的问题是如何从经理的角度管理变量。
我的第一个想法是构建一个由变量类型模板化的对象类,它将保存变量以及变量的序列化/管理方法。
如果我有很多那些
Object<char>, Object<double>, Object<std::vector<int>>
全部转为
Object<void>
并存储在
中std::map<std::string, Object<void>>
我不知道如何与这些对象进行交互(因为Manager不知道底层类型)。我不能将类型存储为Object的元素(遗憾的是类型不是C ++中的对象)并且我不想使用枚举,以便不对除了序列化部分之外可以存储和不能存储的内容施加限制。< / p>
知道我该怎么做吗?
答案 0 :(得分:0)
除了&#34;单身数据管理器&#34;听起来像是一个糟糕的主意(&#34;数据管理器&#34;可能是我永远>想象的类的最差名称),你想要的那种类型的擦除很大程度上基于一个重要的条件:
如果您知道,请使用variant
(Boost有实施)和建议的访客模式。
如果您不这样做,请查看any
。
无论哪种方式,基本思想是使用值表示其运行时类型来注释类型擦除指针。 C ++就是这样做的(我们称之为RTTI),但在您的情况下,手动执行此操作可能更好。