イベントの機構を提供する。
使い方はC#のイベントに似せている。
boost::signalで実装しているので、使用するにはboostのビルドが必要。
クラス図
テストコード
グローバル関数、メンバ関数を以下のようにイベントに登録できる。
(メンバ関数はboost::bindでバインドしている)
#include <boost/bind.hpp>
#include "siki/events.hpp"
namespace testcode{
// グローバルな関数1
void GlobalFunc1(siki::events::EventArgs& args){
}
// グローバルな関数2
void GlobalFunc2(siki::events::EventArgs& args){
}
class TestEvents{
////////////////////////////////////////////////////////////////////////////
//
// ハンドラ型の作成
typedef siki::events::Handler<void(siki::events::EventArgs)> TestHandler;
////////////////////////////////////////////////////////////////////////////
//
// A はデリゲートとイベントを保持する
//
class A{
// デリゲート (class B からは見えない)
siki::events::Delegate<TestHandler> testdelegate;
public:
// イベント (class B から見える)
boost::weak_ptr<siki::events::Event<TestHandler> > testevent;
// Aのコンストラクタ
A() :
testdelegate(),
testevent(testdelegate.get_event()){ // デリゲートからイベントを作成
// GlobalFunc1() をデリゲートに登録
testdelegate += &testcode::GlobalFunc1;
// GlobalFunc1() をデリゲートに登録 // .Add()でも可
testdelegate.Add(&testcode::GlobalFunc1);
// MemberFunc1() をデリゲートに登録
testdelegate += boost::bind(&A::MemberFunc1, this, _1);
}
// イベントを発行する
void OnTest(){
// イベント引数の作成
siki::events::EventArgs args;
// イベント発行
testdelegate.Invoke(args);
}
// メンバ関数1
void MemberFunc1(siki::events::EventArgs& args){
}
};
////////////////////////////////////////////////////////////////////////////
//
// B は A のインスタンスにアクセスできる
//
class B{
public:
// Bのコンストラクタ
B(A &a){
using namespace boost;
using namespace siki::events;
shared_ptr<Event<TestHandler> > testevent = a.testevent.lock();
// イベントの登録解除に使用する接続情報
Connection con;
// GlobalFunc2() をイベントに登録
*(testevent) += &testcode::GlobalFunc2;
// MemberFunc2() をイベントに登録し、その接続情報を取得
con = (*(testevent) += boost::bind(&B::MemberFunc2, this, _1));
// MemberFunc2() の登録を解除する
*(testevent) -= con;
}
// メンバ関数2
void MemberFunc2(siki::events::EventArgs& args){
}
};
public:
TestEvents(){
A a;
B b(a);
a.OnTest();
}
};
}; // namespace testcode
基本的な流れ
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());
最終更新:2009年05月05日 19:49