Boost logo

Boost Users :

Subject: Re: [Boost-users] Serialization of functors and MPL use
From: Robert Ramey (ramey_at_[hidden])
Date: 2010-09-19 15:06:43


Anonymous user wrote:
> Hello,
>
> Thanks for the response.
>
> Actually, I need to create dynamically functosr, because I call a lot
> of different methods coming from several classes. I don't want to
> implement the operator () inside each object used, because it is not
> appropriate in my code (too much classes).
>
> Can you please , give me an example of registration of functors ?

I could if I had nothing else to do right now. I've got on my list to
make a "case study" in the documentation on how to do this. But
for now I'll just give a short explanation off the top of my head.

A functor is just a structure. You can serialize just as you can
any other structure.

The problem is that you want serialize a data variable which
refers to any one of a number of differently defined structures.
This is a specific instance of something that we want to do
in C++ all the time. The most common way of doing this
is to use a pointer to a virtual base class. e.g.

struct functor_interface {
    virtual int /* or other return type */ operator()(int /* other other
return types */ x, ...);
        // virtual makes it polymorphic
        // operator() ... makes a functor
};

So now we can define any number of functors which use the same interface:

struct f1 : public functor_interface {
    virtual int operator()(int x){
        ... whatever
    template<class Archive>
    void serialize(Archive &ar, const unsigned int version){
        //.. this functor has no parameters so nothing to do.
        // .. serialization still needs this defined though
    }
};

struct f2 : public functor_interface {
    int m_a; // member variable which the functor uses at runtime
    virtual int operator()(int x){
        ... whatever - something different than f1
    void serialize(Archive &ar, const unsigned int version){
        ar & m_a;
    }
};

... as many as you want.

Register all the functors
BOOST_EXPORT_CLASS(f1)
...

The above makes the functors exportable - that is associates
the functor f1 with the external string name "f1".

Now you can use a variable

struct my_class {
    functor_interface *m_f;
    ...
    void serialize(Archive &ar, const unsigned int version){
        ar & m_f;
    }
};

Which uses the m_f variable as a "variable function". You
call it with
m_f->operator(112)
or maybe with something slicker like
(*m_f)(112) // or something similar

Now you're done - just serialize m_class like anyother.
when you de-serialize it, it has the same state it did before
(whatever that was).

Home this is helpful.

Robert Ramey


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net