读取带类型标识头的二进制文件:模板类存储数据的最优方案咨询
二进制数据文件的类型化存储与解析方案优化
我需要读取包含原始二进制数据的文件,文件头会指明数据应被解析为整数、浮点数、双精度数等数值类型。原本想通过模板类来存储这些数据,示例代码如下:
#include <filesystem> template <typename T> struct Foo; Foo open(const std::filesystem::path& path);
但这个方案无法运行——虽然我知道所有可能的T类型,但必须在运行时打开文件才能确定具体的T,而模板类型需要编译时确定。
我尝试了几种解决方法:
方法一:纯虚接口+智能指针
定义纯虚基类,让模板子类继承它,返回智能指针:
#include <filesystem> #include <memory> class IFoo; template <typename T> struct Foo : public IFoo { //... }; std::unique_ptr<IFoo> open(const std::filesystem::path& path);
这种方式的不便之处在于:如果后续需要访问T类型的成员变量,或者调用返回Something<T>的成员函数,这些内容无法纳入接口,必须将IFoo转换回Foo<T>才能操作。
方法二:加宽转换统一类型
统一返回Foo<long long>或Foo<double>,如果对浮点型文件调用整数方法(反之亦然)就抛出异常;也可以先调用额外函数判断文件类型再调用open。但文件可能很大,比如把16位整数无意义地转成64位整数会造成4倍内存浪费,这个方案并不理想。
方法三:枚举标识类型+字节向量
用枚举标记数据类型,直接存储原始字节向量:
enum class NumType { Int16, Int32, Float32, Float64, //... }; struct Foo { NumType type; std::vector<char> data; //... }; Foo open(const std::filesystem::path& path);
想问问有没有我遗漏的更优替代方案?
内容的提问来源于stack exchange,提问作者Janilson
相关产品推荐
相关产品推荐

