読者です 読者をやめる 読者になる 読者になる

Boost.statechart 事始め

C++

状態遷移マシンを表現するライブラリとして Boost.statechart ってのがあります。
その紹介。

例えばですが、こんなんがあったとします。

greeting 状態から bye 状態への遷移が say_good_bye によってトリガされる感じですね。

で、こいつを boost::statechart で実装するとこうなります。

#include <iostream>
#include <boost/statechart/state_machine.hpp>
#include <boost/statechart/simple_state.hpp>
#include <boost/statechart/event.hpp>
#include <boost/statechart/transition.hpp>

using namespace std;

namespace sc = boost::statechart;

// declarations

	// states
	struct greeting;
	struct bye;
	// events
	struct say_good_bye;
	// machine
	struct machine


// definitions

	struct machine : sc::state_machine< machine, greeting >
	{};

	struct greeting : sc::simple_state< greeting, machine >
	{
		typedef sc::transition< say_good_bye, bye > reactions;
	};

	struct bye : sc::simple_state< bye, machine >
	{
		bye() { cout << "bye" << endl; }
	};

	struct say_good_bye : sc::event< say_good_bye >
	{};

int main()
{
	machine the_machine;
	the_machine.initiate();
	the_machine.process_event( say_good_bye() );
}

出力

bye
状態遷移マシンの型を machine として、
initiate() で状態をリセット、
process_event() でイベントを渡すと状態遷移します。
状態遷移は reactions という名前で定義しないと遷移してくれません。

もうちょっと何やかんやできるのですがそれは気が向いたら記事を追加します。