現在の実験プロジェクトのために、単純なリスナー/コールバックメカニズムを構築しています。そして、私は、ポインタのベクトルのベクトルであるはずのコンテナ構造を実装することに固執しています。ルートベクトルにイベントタイプのKEYを単純に持たせたいので、この方法を選択します。たとえば、列挙型(int)の場合、このキーに、このイベントタイプで使用可能なメソッドへのポインターのベクトルを格納します。論理表現では、次のようになります。
[EVENT_TYPE_QUIT]
[ptr1]
[ptr2]
[ptr3]
[ptr4]
[....]
[EVENT_TYPE_HELLO]
[....]
[....]
typedef enum {
EVENT_TYPE_QUIT,
EVENT_TYPE_HELLO,
...
} EventType;
したがって、簡略化された実装は次のようになります(実際にはテンプレートですが、Tがイベントをマップできる任意のユーザータイプであると想像してください)。
class EventMapper {
...
typedef void (T::*functionPtr)(); // simple pointer to T member function with no args.
std::vector< std::vector<functionPtr> > eventCallbacks;
void mapEvent(const EventType type, functionPtr callback) {
// here i need to map type to callback
// each type can have multiple callbacks
// T can have only distinct event types as "key"
// this i tried but doesn't work
eventCallbacks[type].push_back(callback);
}
...
}
意図した実装は次のようになります。
EventMapper<SupaDupaClass> mapper;
mapper.mapEvent(EVENT_TYPE_HELLO, &SupaDupaClass::didYouSayHello);
など..。
一意のキーの割り当てを簡単にするために、マップの代わりにベクトルを使用したいですか?ありがとうございました