所以我正在研究一种文件格式,用于存储在某种范围内定义的结构化数据.最简单的例子就像浮动值随着时间的推移,但我正在设计它以允许每个点的多个维度和任意数据.我想将数据的结构存储在文件头中,因为它将允许一些简洁的功能.
起初我以为我会让用户使用类的层次结构来构建他们的数据结构,所以你可以这样做:
pf_type data = record(PF_DOUBLE) (
record("position")(
field("xp") &
field("yp") &
field("zp")) &
record("velocity")(
field("xv") &
field("yv") &
field("zv")) &
record("acceleration")(
field("xa") &
field("ya") &
field("za")));
Run Code Online (Sandbox Code Playgroud)
这相当于C中这样的东西:
struct {
struct position {
double xp,yp,zp;
}
struct velocity {
double xv,yv,zv;
}
struct acceleration {
double xa,ya,za;
}
}
Run Code Online (Sandbox Code Playgroud)
这并不可怕,但它仍然要求用户在读/写数据时单独定义实际使用的ac结构.
我认为如果他们能够定义一个他们传递给我的库的常规c-struct并且我在其上进行内省以获取写入该文件的信息,那就太好了.虽然我不知道在C++中是否可以远程实现类似的东西.我的想法是它可能正在使用一些模板元编程魔法,但它会非常混乱.所以我想我会向那些比我更了解C++的人征求一些想法.
不完全是你想要的,但可能是一个非常好的灵感来源,将是谷歌的Protobufs.它们采用的方法与您在问题中讨论的方法略有不同.使用protobuf,首先在.proto文件中描述您的数据结构,然后使用protobuf编译器(protoc)编码用于几种不同语言(包括C++)之一的样板代码.
代码化代码完全能够反映.proto文件中定义的结构,以及最优化的protobuf是串行化二进制数据以通过线路发送.显然,你会付出一点点性能,但它会给你一些非常高质量的反射,并且简单访问的性能并不是那么高.
从本质上讲,您图书馆的客户可以通过您填写的protobuf.通过直接呼叫您或通过网络呼叫.