トップページ > 関数型プログラミング >
サンプルの動作確認バージョン [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することもできます。
複数の関数を入れておける boost::function
と思えばいいかも。
上のサンプルをご覧になれば、何ができるライブラリなのかは、 皆さんきっとすぐに理解されたことと思われます。 複数の関数を登録しておいて、一度に呼び出すことが出来ます。 Qt で採用されている Signal & Slot という概念の実装らしい。 私はQtを使ったことがないのでよく知らないのですが、 例えば、イベントハンドラを登録しておいて、イベント発生時に呼び出す、 みたいな使い方が出来ますね。
旧バージョンの signals と比べて、 スレッド安全性を考慮して若干インターフェイスが変わっているそうです (が、基本的には同じように使えます)。 また、依存オブジェクトの寿命に依存して自動的にスロット登録を解除するなどの管理機能の面でも、 若干使いやすく改良されています。