加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – Boost MPL生成对象序列化的代码?

发布时间:2020-12-16 10:19:05 所属栏目:百科 来源:网络整理
导读:我想生成序列化/反序列化代码 class Object{ string a; int b; long c; char d;}; 通过查看mpl序列,但我需要能够识别对象并将其检索回来,我无法弄清楚如何获取其成员的名称,我是否必须知道它? 代码应该是这样的 void SerializeObject(ostream os){ serializ
我想生成序列化/反序列化代码

class Object
{
    string a;
    int b;
    long c;
    char d;
};

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

代码应该是这样的

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

   //serialize(object.member,os);
}

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

我的目标是:

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

解决方法

考虑一个boost :: fusion,并使用宏BOOST_FUSION_ADAPT_STRUCT()将您的结构提升为融合序列(随机访问),例如,一旦你定义了上面的结构,你可以做类似的事情

BOOST_FUSION_ADAPT_STRUCT(
    Object,(std::string,a)
    (int,b)
    (long,c)
    (char,d)
)

现在它已被提升,你可以简单地使用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));
}

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

Object foo; // instance to serialize
serialize(<archive>,foo);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读