You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

读取带类型标识头的二进制文件:模板类存储数据的最优方案咨询

二进制数据文件的类型化存储与解析方案优化

我需要读取包含原始二进制数据的文件,文件头会指明数据应被解析为整数、浮点数、双精度数等数值类型。原本想通过模板类来存储这些数据,示例代码如下:

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 20:18:29