开发者

Need help with C++ templates

I'm fairly sure this is a template question, since I can't seem to solve it any other way - but non-template solutions are also w开发者_开发技巧elcome.

A Finite State Machine has a number of program States and each state can react to a number of Events.

So, I want to define classes for Event, State and FSM. FSM has a collection (probably vector, might be linked list if STL gives problems in an embedded system) of States, and State has a collection of Events.

Each state and event have a unique Id and a name string for debugging porpoises.

To be awkward, I don't want the Ids to be integers, but elements of an enum. Each FSM has different enums for its states & events.

How best to code this? Can you give an example with two simple FSMs, or one FSm with two states, each with two events?

For example, if I have

enum myEvents {a, b, c};
enum hisEvents {d, e, f, g};

I want to be able to declare an Event class which accpts constructors params

(myEvents a,char *"event_a")
and
(hisEvents g,char* "event_g")
Note that I don't want to just overload the constructor, since that is restrictive - what if new event enums are added?

And similarly with states, then have my FSMs each have a list of states.

Or am I just being anel, insisting on enums for eventId, when it would be much simpler to pass an int?

thanks.


Btw, I'd rather avoid Boost as it is itself undecided on how well it works in embedded systems. I prefer in-house developed, for complete control.


I'm not shure if I'm understanding things correctly but I'll take a stab at it:

I'm assuming you want to define a state machine by defining the transitions; e.g. "when in state 'myEvents' and you see 'a' do 'event_a'"

class State {};
template<T> RealState : State
{
    static void Add(T event, char*) { /* save stuff */ }
};

class Event {};
template<T> RealEvent : Event    {
    RealEvent(T event, char* name) {RealState<T>(event, name); }
};

Some how you would need to tack in actions and whatnot and you will want to muck it up a bit to get more than one state machine, but I hope that gets you started.


While i understand why you want to avoid code redundancies by implementing the state machine basics generically, i don't understand why you want to implement this yourself.

Take a look at existing implementations like Boost.Statechart or whatever suits your usage scenario best.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜