如何设计对可以包含不同类型的文件的访问
How to design access to files that can contain different types?
这里有一个内部使用的文件类型,它基本上是一个表,其中列可以具有不同的类型。还有一个带有标识哪个列是哪个类型的id的标题。用户通常不会一直生成表布局,有一个相当有限的表布局集(比如10个左右,但将来会有更多)。
我的问题是:在c++中建模这个文件的最佳方法是什么?
我能想到以下的可能性:
-
创建一个模板文件类,其中模板参数是包含列类型的结构体。在另一个静态模板类中,将头id作为静态成员,并提供一个用于字节序安全读取的函数(通过显式模板特化)。
缺点:需要为每个文件创建结构和静态伙伴类。如果静态模板类没有此类型的特化,将在链接时失败。
-
创建一个抽象数据类,为每个可以在列中的类型派生显式覆盖,并动态地将从文件中获得的指向基类的指针强制转换为正确的类型(我可以通过头文件找到)。
-
如上创建一个模板化的文件类。要求模板具有方法来读写文件头文件,并提供端序安全的读取。
缺点:需要为每个文件类型创建带有这些方法的类,而不是像1中那样使用普通结构体。
还有其他建议吗?
由于文件是在运行时读取的,所以编译时的解决方案不是真正的"解决方案"。这是一个典型的"多态类的层次结构",共享一个共同的根,注定从unique_ptr
或shared_ptr
到dynamic_cast
的集合。
基本上,您可以从数据格式中猜测类型,以及push_back
a x_ptr<BaseClass>(new ActualClass)
。
BaseClass
可以让你识别出你正在处理的是哪个ActualClass
,但这更多的是dynamic_cast
的作用。让BaseClass
为空,只使用虚析构函数。
在文件中,每条记录必须以"type_id"开头,它实际上告诉您下面的数据代表的实际类型。
选项:
-
使用自描述数据类型("type-size-value"三元组),并对每个类型执行强制类型转换。
-
使用XML结构(基本上是上述结构的变体)
-
使用相对数据库(例如,代码中嵌入的SQLite或其他任何东西)
- 字符类型转换不兼容
- C++模板/别名 - 模板参数列表中参数 1 处的类型/值不匹配
- C++ 写入路径名中包含不需要的空字符的文件
- 错误:"模板<类_Tp,类_Dp>类 std::unique_ptr"的模板参数列表中参数 1 的类型/值不匹配
- 为什么"fun(i)"被推导出为"fun<int&>"而不是"fun<int>",因为"i"是"int"的类型而不是参考?
- 创建模板类型而不新建/删除
- 成员引用基类型 'char' 不是 C++ 中的结构或联合
- "+=" 操作在类型之间不起作用 std::复杂<double>和__complex__双精度
- 何时使用表达式的类型(而不是类别)?
- 无法打开包含文件'Graphics.hpp'没有这样的文件或目录,Visual Studio的其他包含不起作用
- 表达式必须具有类类型。不知道怎么解决
- 不同c++编译器之间的自动类型推导不匹配
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 模板 ctor 类型推导不起作用(没有匹配的构造函数用于初始化 ...)与函数<>参数
- 在变量名后声明带有 () 的非内部类型与不使用变量名的行为不同。即 std::map<int,char>x(); - 这是怎么回事?
- 在 lambda 中从引用类型捕获的值的类型,不使用通用捕获
- 标头包含不是 .c 程序所必需的,而是.cpp程序需要的
- 包含相邻顶点列表的自定义顶点类型[图形]:不完整类型错误
- 如何创建一个包含类型尚不知道的值的类?
- c++:包含对象的确切类型,不需要强制类型转换