Hi,

I want no_transition() to be called whenever no row matches, even if there is a row that does not match only because the guard returns false. How can I achieve this? I want to be strict about the input events. I can probably workaround this by putting guardless rows at the top whose action is to call no_transition(), but I'm hoping to find a cleaner solution.

If I get this behavior in msm, then the following code should output "no transition..." as its last line. Right now, with boost 1.51, it doesn't. It just prints "entering State1".

Josh

#include <iostream>

#include <boost/msm/back/state_machine.hpp>
#include <boost/msm/front/functor_row.hpp>
#include <boost/msm/front/state_machine_def.hpp>


using namespace std;

namespace mpl = boost::mpl;
namespace msm = boost::msm;
using namespace msm::front;

struct Event {
    Event(bool data) : data(data) { }
    bool data;
};

struct state_ : public msm::front::state_machine_def<state_> {
    struct MyGuard {
        template <class EVT, class FSM, class SourceState, class TargetState>
        bool operator()(EVT const& e, FSM&, SourceState&, TargetState&) {
            return e.data;
        }
    };

    struct State1 : public msm::front::state<> {
        // optional entry/exit methods
        template <class Event,class FSM>
        void on_entry(Event const&, FSM& f) { std::cout << "entering: State1" << std::endl; }
        template <class Event,class FSM>
        void on_exit(Event const&,FSM& ) { std::cout << "leaving: State1" << std::endl; }
    };

    struct State2 : public msm::front::state<> {
        // optional entry/exit methods
        template <class Event,class FSM>
        void on_entry(Event const&, FSM& f) { std::cout << "entering: State2" << std::endl; }
        template <class Event,class FSM>
        void on_exit(Event const&,FSM& ) { std::cout << "leaving: State2" << std::endl; }
    };

    typedef State1 initial_state;
    struct transition_table : mpl::vector<
        Row< State1, Event , State2, none, MyGuard >
    > {};

    template <class FSM, class Event>
    void no_transition(Event const& e, FSM&, int state) {
        std::cout << "no transition from state " << state
            << " on event " << typeid(e).name() << std::endl;
    }
};

typedef msm::back::state_machine<state_> State;

int main() {
    State state;
    state.start();
    state.process_event(Event(false));
    return 0;
}