boost::signals2

トップページ > 関数型プログラミング >

abstract

必要なヘッダ
<boost/signals2.hpp>
出来ること
Signal/Slot
リファレンス
en / jp(一部)

sample

サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]

#include <iostream>
#include <boost/signals2.hpp>
using namespace std;

void Dog(int c)
{
	for(int i=0; i!=c; ++i)
		cout << "BowWow" << endl;
}
void Cat(int c)
{
	for(int i=0; i!=c; ++i)
		cout << "Mewmew" << endl;
}
void Chicken(int c)
{
	for(int i=0; i!=c; ++i)
		cout << "cock-a-doodle-doo" << endl;
}

int main()
{
	// 登録
	boost::signals2::signal<void (int)> sig;
	sig.connect( &Dog );
	sig.connect( &Cat );
	sig.connect( &Chicken );

	// 呼び出し
	sig( 2 );

	return 0;
}

出力例

Mewmew
Mewmew
cock-a-doodle-doo
cock-a-doodle-doo
BowWow
BowWow

単にconnectすると、登録した順に呼び出されます。 順番を指定してconnectすることもできます。

etc

複数の関数を入れておける boost::function と思えばいいかも。

上のサンプルをご覧になれば、何ができるライブラリなのかは、 皆さんきっとすぐに理解されたことと思われます。 複数の関数を登録しておいて、一度に呼び出すことが出来ます。 Qt で採用されている Signal & Slot という概念の実装らしい。 私はQtを使ったことがないのでよく知らないのですが、 例えば、イベントハンドラを登録しておいて、イベント発生時に呼び出す、 みたいな使い方が出来ますね。

旧バージョンの signals と比べて、 スレッド安全性を考慮して若干インターフェイスが変わっているそうです (が、基本的には同じように使えます)。 また、依存オブジェクトの寿命に依存して自動的にスロット登録を解除するなどの管理機能の面でも、 若干使いやすく改良されています。

presented by k.inaba (kiki .a.t. kmonos.net) under CC0