パブリック インターフェイス (API) を使用していくつかのロジックを実装する必要があります。
int api_open();
int api_1(int a, int b);
int api_2(int x, int y);
...
各 API 呼び出しの戻り値と「意味」は、状態によって異なります。ルールの例: api_open() 呼び出しが成功する前に API 呼び出しを行うと、エラーが返されます。ここには、初期状態と開いた状態の 2 つの状態があります。初期状態では、api_open() を除くすべての API 呼び出しでエラーが返されます。開いた状態の api_1() と api_2() で、いくつかのアクションを実装します。
通常、これは、パブリック インターフェイスと具体的な型で実装された状態を持つ状態パターンとして実装します。例: https://www.robertlarsononline.com/2017/05/11/state-pattern-using-cplusplus/
それから私は思った..各boost.msm状態がこのようなものなら
//opened state
struct opened : public msm::front::state<api_impl> {
virtual int api_open(){}
virtual int api_1(int a, int b){}
virtual int api_2(int x, int y){}
};
...
typedef msm::back::state_machine<api_> api_fsm;
次に、必要なのは、ステート マシンから現在の状態にアクセスし、API メソッドを呼び出すことだけです。
api_impl* impl = api_fsm.get_state_by_id(*api_fsm.current_state());
ただし、ドキュメントから引用します。 current_state 現在アクティブな状態の ID を返します。通常は、デバッグまたはロギングの目的でのみ必要になります。
boost.msm ライブラリを誤用しようとしているように感じます....古典的な oop 状態パターンを msm と混ぜようとしていると思います。これは良くない....
各 API 呼び出しをイベントとして (API 呼び出しパラメーターを表すデータと共に) ステート マシンに渡し、何らかの形でそこから戻り値を取得する必要があります...どのように?
ステート マシンにデータを送信し、それを取得することは明らかではないように感じます。それとも、私は要点を得ていないのでしょうか?
主な質問は次のとおりです:boost.msmで私の問題を解決する適切な方法は何ですか?