Increase MPL to generate code for serializing objects?

I want to create serialization / deserialization code for

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

after looking at the mpl sequence, but I need to be able to identify the object and return it back, I can’t figure out how to get the names of its members , I need to know this

the code should look like

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

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

I want to generate the above code by the user, defining only the mpl sequence corresponding to the layout of the object, is this possible, can you give me some tips?

My goal:

The user defines mpl::vector<String, int, long, char>for the above object, and mine metaprogramcan generate the required code.

+3
source share
3 answers

a 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);
+10

. , :

template<typename ObjT, typename MemberT, MemberT ObjT::*Ptr>
struct member{};

mpl::vector
<
    member<Object, string, &Object::a>,
    member<Object, int, &Object::b>,
    member<Object, long, &Object::c>,
    member<Object, char, &Object::d>
>;

, member, operator>> member, member_vec operator>> member_vec, member_vec. ,

, :

auto serializer =
        mem(&Object::a) >>
        mem(&Object::b) >>
        mem(&Object::c) >>
        mem(&Object::d);

, . - , .

+2

mpl::string . , , - .

typedef mpl::string < 'n', 'a', 'm', 'e' > name;

mpl::c_str < name >::value . "".

I save a sequence of such member names, another sequence of member pointers, their zip together, and then use one of the boost :: fusion query algorithms to find the member pointer for the given member name.

I will send the code if you are interested. I currently do not have access to it, as it is on my home PC.

0
source

All Articles