0

我基本上想为我想要制作的一些数据类型创建一个内部结构。这些数据类型将保存我程序中的大部分信息(基本上是一个大型数据库,但我想避免设置一个使用的麻烦)并将被序列化/反序列化。

但我想从文本文件/ml 文件的布局中动态创建这些类/结构。例如:

container Music
field string name
field largenumber filesize
end container

这是一个非常基本的例子:在上面,'container' 将是数据类型(类或结构),'field' 表示变量(字符串是.. stl 字符串,大数是无符号整数或是的,我意识到我想要一个检查正确语法的 C++ 解析器(作为编译器)之类的东西。

我基本上希望我的程序的用户创建自己的数据类型(添加字段/删除字段/创建自己的结构),然后将其永久保留在我的程序中。

(我已经弄清楚了如何在执行此操作时进行序列化/反序列化 - 我所要做的就是确保我还将最后创建的类/结构文本文件与序列化数据一起保存,这样我就可以在反序列化时重新创建数据类型)。

有人知道如何去做,或者建议更好地实现我的设计吗?

PS 显然这些信息需要在运行时创建,而不是编译时。

4

2 回答 2

1

正如你所建议的,我会通过编写一个 XML 解析器来做到这一点,并且数据类型定义将在文件中。这样,解析变得非常容易(使用任何 XML 读取库)。您在运行时创建数据类型,您所需要的只是:一个类Container和一个类Field,您可以在其中存储名称、类型等。

你预处理你的 XML 文件,生成一个函数来填充你的一些数据结构,通常看起来像:

Field newfield1 (name, type, whatever);
Field newfield2 (name2, type2, whatever2);
...
Container newContainer;
newContainer.addField(newfield1);
newContainer.addField(newfield2);
...

当然,您可以比这更好地组织您的代码,但这只是为了给出想法。首先将您的数据类型写为 XML,预处理您的 XML 并生成“运行时”.cpp 文件以创建您的动态类型,将其包含在您的项目中,然后您可以根据需要使用您的类型。

要创建不同类型的字段(事先不知道),您可以使用 boost::variant(也可以从 XML 生成类型列表)。您甚至可以为每个字段生成一个 typedef,以确保稍后在使用 boost:get<> 时使用正确的类型。

于 2012-11-28T18:08:43.750 回答
1

对于 XML 到对象的转换,您实际看到的是 SOAP 的一部分。我更喜欢 RapidXML,但您可以尝试使用其他 XML 解析器来创建/读取您的对象。

对于文本文件,您可能必须编写自己的解析器来正确处理文本文件并期望正确的类型和定义,然后相应地生成对象。

我同意,除非存在通用接口,否则动态创建对象并用值填充它并非易事。

作为旁注,既然您说您希望您的用户动态地“创建”类型,为什么不研究一种简单的脚本语言(或自己制作一个 DSL?)

于 2012-11-28T18:00:46.970 回答