質問
これはテンプレートの質問であると確信しています。他の方法では解決できないようですが、テンプレート以外のソリューションも大歓迎です。
有限状態マシンには多くのプログラム状態があり、各状態は多くのイベントに反応することができます。
だから、イベント、州、FSMのクラスを定義したいと思います。 FSMには、状態の埋め込みシステムでSTLが問題を与える場合、コレクション(おそらくベクトル、リンクリストになる可能性があります)があり、状態にはイベントのコレクションがあります。
各状態とイベントには、ネズミをデバッグするための一意のIDと名前文字列があります。
厄介になるために、私はIDを整数にするのではなく、列挙の要素にしたくありません。各FSMには、州とイベントに異なる酵素があります。
これをコーディングするのが最善ですか? 2つの単純なFSMを使用して例を挙げてください。それぞれ2つのイベントがある2つの状態のFSM 1つを挙げていただけますか?
たとえば、私が持っている場合
enum myEvents {a, b, c}; enum hisEvents {d, e, f, g};
コンストラクターがパラメーションを加えるイベントクラスを宣言できるようになりたい
(myEvents a,char *"event_a")と
(hisEvents g,char* "event_g")コンストラクターをオーバーロードしたくないことに注意してください。それは制限的であるため、新しいイベントenumsが追加された場合はどうなりますか?
同様に州と同様に、私のFSMにそれぞれに州のリストを持たせる。
それとも、私はアネルであり、eventidの列挙を主張しています。 多くの INTに合格する方が簡単ですか?
ありがとう。
ところで、それ自体が組み込みシステムでどれだけうまく機能するかについては未定であるため、私はむしろブーストを避けたいと思います。私は完全に制御するために、社内開発を好みます。
解決
私が物事を正しく理解しているなら、私はshureしていませんが、私はそれを刺します:
遷移を定義して、状態マシンを定義したいと思います。たとえば、「州の「myevents」と「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); }
};
アクションなどに取り組む必要がある方法があります。複数のステートマシンを手に入れるために少しマックしたいと思うでしょうが、それがあなたが始められることを願っています。
他のヒント
ステートマシンの基本を一般的に実装してコード冗長性を避けたい理由は理解していますが、なぜこれを自分で実装したいのか理解できません。
次のような既存の実装をご覧ください boost.statechart または、あなたの使用シナリオに最適なものは何でも。