如何设计对可以包含不同类型的文件的访问

How to design access to files that can contain different types?

本文关键字:同类型 包含不 文件 访问      更新时间:2023-10-16

这里有一个内部使用的文件类型,它基本上是一个表,其中列可以具有不同的类型。还有一个带有标识哪个列是哪个类型的id的标题。用户通常不会一直生成表布局,有一个相当有限的表布局集(比如10个左右,但将来会有更多)。

我的问题是:在c++中建模这个文件的最佳方法是什么?

我能想到以下的可能性:

  1. 创建一个模板文件类,其中模板参数是包含列类型的结构体。在另一个静态模板类中,将头id作为静态成员,并提供一个用于字节序安全读取的函数(通过显式模板特化)。

    缺点:需要为每个文件创建结构和静态伙伴类。如果静态模板类没有此类型的特化,将在链接时失败。

  2. 创建一个抽象数据类,为每个可以在列中的类型派生显式覆盖,并动态地将从文件中获得的指向基类的指针强制转换为正确的类型(我可以通过头文件找到)。

  3. 如上创建一个模板化的文件类。要求模板具有方法来读写文件头文件,并提供端序安全的读取。

    缺点:需要为每个文件类型创建带有这些方法的类,而不是像1中那样使用普通结构体。

还有其他建议吗?

由于文件是在运行时读取的,所以编译时的解决方案不是真正的"解决方案"。这是一个典型的"多态类的层次结构",共享一个共同的根,注定从unique_ptrshared_ptrdynamic_cast的集合。

基本上,您可以从数据格式中猜测类型,以及push_back a x_ptr<BaseClass>(new ActualClass)

BaseClass可以让你识别出你正在处理的是哪个ActualClass,但这更多的是dynamic_cast的作用。让BaseClass为空,只使用虚析构函数。

在文件中,每条记录必须以"type_id"开头,它实际上告诉您下面的数据代表的实际类型。

选项:

  1. 使用自描述数据类型("type-size-value"三元组),并对每个类型执行强制类型转换。

  2. 使用XML结构(基本上是上述结构的变体)

  3. 使用相对数据库(例如,代码中嵌入的SQLite或其他任何东西)

相关文章: