私は基本クラスObject
とEvent
class Object
{
//...
};
class Event
{
};
そして、関数ポインタの typedef
typedef void (Object::*PF) (Event*);
そして、2 つのポインターを格納する無関係なクラス
class Dispatcher
{
public:
Dispatcher (Object* obj, PF pf) : _obj (obj), _pf (pf)
void call (Event* event)
{
_obj->*pf (event);
}
Object* _obj;
PF _pf;
};
次に、具体的なオブジェクトと具体的なイベントがあります
class ConcreteEvent : public Event
{
};
class ConcreteObject : public Object
{
public:
void handle (ConcreteEvent* event)
{
// Do something specific for ConcreteEvent
}
};
そして、このように呼び出します
ConcreteObject* obj = new ConcreteObject();
Dispatcher dispatcher (obj, static_cast<PF>(&ConcreteObject::handle));
ConcreteEvent* event = new ConcreteEvent ();
dispatcher.call (event);
ディスパッチャが常に正しいイベントで呼び出されることを保証します。つまり、ディスパッチャがConcreteEvent
カプセル化する関数ポインタが実際にSomeOtherConcreteEvent
問題は次のとおりです。これは動作することが保証されていますか? Linux と mingw の両方で、gcc 4.7 で確実に正常に動作します。