|
Boost Users : |
Subject: Re: [Boost-users] Serialization of functors and MPL use
From: Anonymous user (nokiac5eel_at_[hidden])
Date: 2010-09-19 13:37:40
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 ?
Thanks in advance.
Regards.
> ----- Original message -----
> From: "OvermindDL1â" <overminddl1_at_[hidden]>
> To: boost-users_at_[hidden]
> Subject: Re: [Boost-users] Serialization of functors and MPL use
> Date: Fri, 17 Sep 2010 00:22:11 -0600
>
>
>On Thu, Sep 16, 2010 at 2:43 PM, Anonymous user <nokiac5eel_at_[hidden]>
wrote:
> > Hello everybody,
> >
> >
> >
> > I'm currently trying to serialize functors.
> >
> > Apparently, it is not possible to serialize boost::function objects,
> >
> > is it possible to find a way to serialize pointer to function ? (in
order to
> > make working the example below*)
> >
> > If it is definitively not possible, is there a way to 'register' a
relation
> > betwwen objects and functor ? (using MPL library).
> >
> > The idea is to rebuild the boost function according to the 'Object
and
> > 'Type' class of the template'.
> >
> >
> >
> > Example:
> >
> >
> >
> > mpl::pair<Object,Function> container;
> >
> > serialize()
> >
> > {
> >
> > boost::function<Type ()> m_getter=mpl::at< container,Object>;
> >
> > }
> >
> >
> >
> >
> >
> > *Here is the problem that I'm trying to resolve:
> >
> >
> >
> > MyObject myObject("before");
> >
> >
> >
> > SetCommand<std::string,MyObject>
> > SetCommand(myObject,&MyObject::setName,&MyObject::getName,"after");
> >
> >
> >
> > SetCommand.do(); // call functor 'MyObject::setName("after")'
> >
> > SetCommand.undo(); // call functor 'MyObject::setName("before")'
> >
> >
> >
> >
> >
> > template<typename Type,typename Object>
> >
> > class SetCommand : public Command
> >
> > {
> >
> >
> >
> >
> >
> > public:
> >
> >
> >
> > template <typename Setter, typename Getter>
> >
> > SetCommand(Object& o, const Setter& setter, const Getter&
getter,
> > const Type& value) :
> >
> > Command(),
> >
> > m_getter(boost::bind(getter, &o)),
> >
> > m_setter(boost::bind(setter, &o, _1)),
> >
> > initialValue(m_getter()),
> >
> > finalValue(value)
> >
> > {
> >
> > }
> >
> >
> >
> > virtual void undo()
> >
> > {
> >
> > m_setter(initialValue) ;
> >
> > }
> >
> >
> >
> > virtual void do()
> >
> > {
> >
> > m_setter(finalValue) ;
> >
> > }
> >
> >
> >
> > private:
> >
> >
> >
> > friend class boost::serialization::access;
> >
> >
> >
> > SetCommand(){}
> >
> >
> >
> > template <class Archive>
> >
> > void serialize( Archive & ar, const unsigned int version )
> >
> > {
> >
> >
> >
> > ar & m_getter; ERROR -> does not compile !!!
> >
> > ar & m_setter; ERROR -> does not compile !!!
> >
> >
> >
> > ar & initialValue;
> >
> > ar & finalValue;
> >
> > }
> >
> >
> >
> > boost::function<Type ()> m_getter ;
> >
> > boost::function<void (Type)> m_setter ;
> >
> >
> >
> > Type initialValue ;
> >
> > Type finalValue ;
> >
> > };
> >
> >
> >
> > Thanks in advance.
>
> You need to somehow register the function in there, if you know what a
> limited set of types it might be, an integer that can rebuild it would
> work, but the most common way is to just make a base class with an
> operator() and have a (shared) pointer to that be your 'function',
> then base classes (that can be properly serialized) to act as the
> functions. Not pretty, not the easiest, but it works well and is
> expandable.
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
--------------------------------------------------------------
Ovi Mail: Making email access easy
http://mail.ovi.com
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