C++と色々

主にC++やプログラムに関する記事を投稿します。

boost::signals2

C++のためのAPIデザイン読んでいて初めて知ったのでメモ。
複数の関数を入れられるstd::functionみたいなもの。
同じシグネチャの関数ポインタ・関数オブジェクトを複数登録して、まとめて呼び出すことができる。
呼び出す順序はデフォルトだと、登録した順(キュー)だけど、後から登録した順(スタック)とか、
数字で番号つけてその順に呼び出すとかもできる。後から任意の関数を削除することもできる。

サンプル

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

void a(int n)
{
	cout << "a" << n * 1 << endl;
}

void b(int n)
{
	cout << "b" << n * 2 << endl;
}

void c(int n)
{
	cout << "c" << n * 3 << endl;
}

int main()
{
	boost::signals2::signal<void (int)> s;
	//第1引数 呼び出して欲しい順
	//第2引数 登録したい関数
	s.connect(1, a);
	s.connect(0, b);
	s.connect(2, c);
	//登録した関数の戻り値を覚えておくことで、その関数を削除できる
	auto connect = s.connect(0, a);
	
	//実行
	s(2);

	cout << "--------" << endl;

	//削除
	connect.disconnect();


	//1つ呼び出しが減っている
	s(3);
}

実行結果

b4
a2
a2
c6
--------
b6
a3
c9
続行するには何かキーを押してください . . .

使い所としては、ゲームの毎ループ時に行う処理をまとめておくとか、オブジェクト間通知のときにオブサーバーパターンの他にこれを使う等ですかね(イベント発生を通知する)。

参考文献
マーティン・レディ:"C++のためのAPIデザイン"、ソフトバンククリエイティブ(2012)
"シグナル/スロット":https://sites.google.com/site/boostjp/tips/signals(2012/11/07アクセス)
"letsboost::signals2":http://www.kmonos.net/alang/boost/classes/signals2.html(2012/11/07アクセス)
"boost::signals2 が便利そうな件について":http://d.hatena.ne.jp/gintenlabo/20091201/1259671954(2012/11/08アクセス)