在C++中内省结构定义?

gct*_*gct 5 c++

所以我正在研究一种文件格式,用于存储在某种范围内定义的结构化数据.最简单的例子就像浮动值随着时间的推移,但我正在设计它以允许每个点的多个维度和任意数据.我想将数据的结构存储在文件头中,因为它将允许一些简洁的功能.

起初我以为我会让用户使用类的层次结构来构建他们的数据结构,所以你可以这样做:

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++的人征求一些想法.

sbl*_*lom 7

完全是你想要的,但可能是一个非常好的灵感来源,将是谷歌的Protobufs.它们采用的方法与您在问题中讨论的方法略有不同.使用protobuf,首先在.proto文件中描述您的数据结构,然后使用protobuf编译器(protoc)编码用于几种不同语言(包括C++)之一的样板代码.

代码化代码完全能够反映.proto文件中定义的结构,以及最优化的protobuf是串行化二进制数据以通过线路发送.显然,你会付出一点点性能,但它会给你一些非常高质量的反射,并且简单访问的性能并不是那么高.

从本质上讲,您图书馆的客户可以通过您填写的protobuf.通过直接呼叫您或通过网络呼叫.