0

パブリック インターフェイス (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で私の問題を解決する適切な方法は何ですか?

4

0 に答える 0