Boost logo

Boost :

Subject: Re: [boost] [msm]Event convert at exit point
From: Christophe Henry (christophe.j.henry_at_[hidden])
Date: 2011-10-10 16:11:19


----- Original Message -----
From: "Christophe Henry" <christophe.j.henry_at_[hidden]>
Newsgroups: gmane.comp.lib.boost.devel
To: <boost_at_[hidden]>
Sent: Monday, October 10, 2011 9:54 PM
Subject: Re: [msm]Event convert at exit point

>> Hello,
>>
>> I have a question about Boost.Msm event conversion at exit pseudo state.
>> (Version 1.47.0)
>>
>> http://www.boost.org/doc/libs/1_47_0/libs/msm/doc/HTML/ch03s02.html#d0e942
>>
>> Exit pseudo states
>>
>> struct event6
>> {
>> event6(){}
>> template <class Event>
>> event6(Event const&){}
>> }; //convertible from any event
>>
>> Above document said that we can convert the event using the template
>> constructor. This exmaple doesn't access the constructor's parameter.
>>
>> I want to propagate some value of the event. Event2 is a source event.
>> And Event3 is a target event like this.(see attached file)
>>
>> struct Event2 {
>> Event2(int val_):val(val_) {}
>> int val;
>> };
>>
>> struct Event3 {
>> Event3(int val_):val(val_) {}
>> template <class T> Event3(T const& e):val(e.val) {} // error
>> Event3(Event2 const& e):val(e.val) {} // OK
>> int val;
>> };
>>
>> // Transition table
>> struct transition_table:mpl::vector<
>> // Start Event Next Action Guard
>> msmf::Row < SubState1, Event2, Exit, msmf::none,
>> msmf::none >
>> > {};
>>
>> struct Exit :msm::front::exit_pseudo_state<Event3> {};
>>
>> But compile error occurred. The compiler said Event1 doesn't have a
>> member 'val'.
>> I'm not sure why Event3's constructor instantiate from Event1. This is
>> the question.
>> If I define the constructor that has a parameter Event2 instead of
>> template
>> parameter, compile error doesn't occur.
>>
>> exit_pt_convert.cpp(attached file) is a source code that reproduces this
>> error.
>>
>> Thanks,
>> Takatoshi
> Hi Takatoshi,
>
> this question has already been asked some time ago in a slightly different
> context (http://lists.boost.org/Archives/boost/2010/09/170506.php). This
> is unfortunately one of the points where I had to leave the compile-time
> world earlier than I would like (but found no better solution yet). While
> Event1 will not be considered for forwarding, the compiler does not know
> because it's only known at run-time, and it therefore complains that you
> cannot create Event1 from Event2.
>
> The surprise to me is that the compiler is happy with only your second
> constructor, I'd expect it to require a constructor taking Event1. Should
> it happen, you will need to use the enable_if / disable_if workaround
> presented in the above thread.
>
> I'll update the doc so that this current limitation is documented until I
> find a better solution.
>
> Regards,
>
> Christophe

Or simplier:

template <class T> Event3(T const& ):val(0) {} // not used
Event3(Event2 const& e):val(e.val) {} //conversion constructor


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk