Appendix C. シグナルを自作するには

今までgtkmmのシグナルとシグナルハンドラを見てきましたが、同じテクニックを使って自作のクラス同士で通信を行いたくなったのではないでしょうか。これは直接libsigc++ライブラリを使えば大変シンプルにできます。

この話は純粋にはgtkmmでもGUIのものでもありません。gtkmmではlibsigc++を使って、GTK+シグナルシステムの代理となるC++ラッパーを実装しています。しかし、まったく新しくGTK+シグナルと関係のないのものとして、純粋なC++シグナルを生成することができます。sigc::signal<>テンプレートを使ってください。

例えば、二つのパラメータ、boolintを送るようなシグナルを生成するには、sigc::signalをそのように定義してください。このように:

sigc::signal<void, bool int> signal_something;

シグナルは単にpublicなメンバ変数として定義することもできますが、中にはそれはよくないと、アクセッサメソッド経由でシグナルを使ったほうがいいと思う人もいます。このように:

class Server
{
  //signal accessor:
  typedef sigc::signal<void, bool, int> type_signal_something;
  type_signal_something signal_something();

protected:
  type_signal_something m_signal_something;
};

Server::type_signal_something Server::signal_something()
{
  return m_signal_something;
}

定義したシグナルを接続するにはgtkmmのシグナルのときと同じシンタックスを使って行います。このように:

server.signal_something().connect(
  sigc::mem_fun(client, &Client::on_server_something) );

実際に動いている例はexamples/book/signals/custom/を参照してください。