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アクセス)