siki > events

イベントの機構を提供する。
使い方はC#のイベントに似せている。
boost::signalで実装しているので、使用するにはboostのビルドが必要。

名前空間 siki::events
ドキュメント siki::events
関連項目
クラス Delegate
クラス Event
クラス EventArgs
クラス Handler


クラス図



テストコード

グローバル関数、メンバ関数を以下のようにイベントに登録できる。
(メンバ関数はboost::bindでバインドしている)
  1. #include <boost/bind.hpp>
  2. #include "siki/events.hpp"
  3.  
  4. namespace testcode{
  5.  
  6. // グローバルな関数1
  7. void GlobalFunc1(siki::events::EventArgs& args){
  8. printf("GlobalFunc1()!\n");
  9. }
  10. // グローバルな関数2
  11. void GlobalFunc2(siki::events::EventArgs& args){
  12. printf("GlobalFunc2()!\n");
  13. }
  14.  
  15. class TestEvents{
  16. ////////////////////////////////////////////////////////////////////////////
  17. //
  18. // ハンドラ型の作成
  19. typedef siki::events::Handler<void(siki::events::EventArgs)> TestHandler;
  20.  
  21. ////////////////////////////////////////////////////////////////////////////
  22. //
  23. // A はデリゲートとイベントを保持する
  24. //
  25. class A{
  26. // デリゲート (class B からは見えない)
  27. siki::events::Delegate<TestHandler> testdelegate;
  28. public:
  29. // イベント (class B から見える)
  30. boost::weak_ptr<siki::events::Event<TestHandler> > testevent;
  31.  
  32. // Aのコンストラクタ
  33. A() :
  34. testdelegate(),
  35. testevent(testdelegate.get_event()){ // デリゲートからイベントを作成
  36.  
  37. // GlobalFunc1() をデリゲートに登録
  38. testdelegate += &testcode::GlobalFunc1;
  39. // GlobalFunc1() をデリゲートに登録 // .Add()でも可
  40. testdelegate.Add(&testcode::GlobalFunc1);
  41. // MemberFunc1() をデリゲートに登録
  42. testdelegate += boost::bind(&A::MemberFunc1, this, _1);
  43. }
  44.  
  45. // イベントを発行する
  46. void OnTest(){
  47. // イベント引数の作成
  48. siki::events::EventArgs args;
  49. // イベント発行
  50. testdelegate.Invoke(args);
  51. }
  52.  
  53. // メンバ関数1
  54. void MemberFunc1(siki::events::EventArgs& args){
  55. printf("MemberFunc1()!\n");
  56. }
  57.  
  58. };
  59.  
  60. ////////////////////////////////////////////////////////////////////////////
  61. //
  62. // B は A のインスタンスにアクセスできる
  63. //
  64. class B{
  65. public:
  66. // Bのコンストラクタ
  67. B(A &a){
  68. using namespace boost;
  69. using namespace siki::events;
  70.  
  71. shared_ptr<Event<TestHandler> > testevent = a.testevent.lock();
  72.  
  73. // イベントの登録解除に使用する接続情報
  74. Connection con;
  75. // GlobalFunc2() をイベントに登録
  76. *(testevent) += &testcode::GlobalFunc2;
  77. // MemberFunc2() をイベントに登録し、その接続情報を取得
  78. con = (*(testevent) += boost::bind(&B::MemberFunc2, this, _1));
  79. // MemberFunc2() の登録を解除する
  80. *(testevent) -= con;
  81. }
  82.  
  83. // メンバ関数2
  84. void MemberFunc2(siki::events::EventArgs& args){
  85. printf("MemberFunc2()!\n");
  86. }
  87. };
  88.  
  89. public:
  90. TestEvents(){
  91. A a;
  92. B b(a);
  93. a.OnTest();
  94. }
  95. };
  96.  
  97. }; // namespace testcode
  98.  

基本的な流れ


1. ハンドラを作成する。
typedef Handler<void(siki::events::EventArgs)> TestHandler;

2. ハンドラを基にデリゲートを作成する。
Delegate<TestHandler> testdelegate;

3. デリゲートを基にイベントオブジェクトを作成する。
weak_ptr<Event<TestHandler> > testevent = testdelegate.get_event();

4. イベントオブジェクトにイベント関数を追加する。
*(testevent.lock()) += &GlobalFunc;

5. デリゲートのInvokeメソッドでイベントを発行する。
testdelegate.Invoke(siki::events::EventArgs());



[09/05/05 19:49][履歴][編集]
最終更新:2009年05月05日 19:49
添付ファイル