0

我正在 C++ 中尝试一个 datamanager 框架,它会定期(当 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++ 中的对象),并且我不想使用枚举,以免对除了序列化部分之外可以存储和不能存储的内容施加限制。

知道我该怎么做吗?

4

1 回答 1

0

除了“单例数据管理器”听起来是个糟糕的想法(“数据管理器”可能是我能想象到的最糟糕的类名称)这一事实之外,想要的类型擦除很大程度上基于一个重要条件:

我事先知道所有类型吗?

  • 如果您知道,请使用variant(Boost 有一个实现)和建议的访问者模式。

  • 如果没有,请看一下any

无论哪种方式,基本思想是使用表示其运行时类型的来注释类型擦除指针。C++ 可以做到这一点(我们称之为 RTTI),但在你的情况下,最好手动完成。

于 2014-09-26T13:35:50.787 回答