提升MPL生成对象序列化的代码?

Ram*_*ngh 3 c++ boost metaprogramming boost-mpl template-meta-programming

我想生成序列化/反序列化代码

class Object
{
    string a;
    int b;
    long c;
    char d;
};
Run Code Online (Sandbox Code Playgroud)

通过查看mpl序列,但我需要能够识别对象并将其检索回来,我无法弄清楚如何获取其成员的名称,我是否必须知道它

代码应该是这样的

void SerializeObject(ostream os)
{
   serialize(object.a, os);
   serialize(object.b, os);

   //serialize(object.member, os);
}
Run Code Online (Sandbox Code Playgroud)

我想用户生成上面的代码只定义一个对应于对象布局的mpl序列,是否可行,你能给我一些提示吗?

我的目标是:

用户mpl::vector<String, int, long, char>为上面的对象定义,我metaprogram可以生成所需的编码.

Nim*_*Nim 10

考虑一下boost::fusion,并使用宏BOOST_FUSION_ADAPT_STRUCT()将您的结构提升为融合序列(随机访问),例如,一旦定义了上述结构,就可以执行类似的操作

BOOST_FUSION_ADAPT_STRUCT(
    Object,
    (std::string, a)
    (int, b)
    (long, c)
    (char, d)
)
Run Code Online (Sandbox Code Playgroud)

现在它已被提升,你可以简单地使用a for_each来迭代成员,例如:

template<typename archive>
struct serializer {
   serializer(archive& ar):ar(ar) {}

   template<typename T>
   void operator()(const T& o) const {
      ar & o;  // assuming binary for example...
   }
   archive& ar;
};

template<typename archive, typename sequence>
void serialize(archive& ar, sequence const& v) {
   boost::fusion::for_each(v, serializer<archive>(ar));
}
Run Code Online (Sandbox Code Playgroud)

要使用,它应该简单如下:

Object foo; // instance to serialize
serialize(<archive>, foo);
Run Code Online (Sandbox Code Playgroud)