A generic event dispatcher and listener implemented in c++
A proof of concept for generic type-safe event handling, intended to be an improvement over code like this:
class Foo : public EventListener {
/* ... */
void onEvent(const Event* evt) {
switch (evt.getId()) {
case A_EVENT:
AEvent *aEvt = static_cast<AEvent*>(evt);
// ...
break;
case B_EVENT:
BEvent *bEvt = static_cast<BEvent*>(evt);
// ...
break;
// etc
}
}
};What's so bad about it?
- Switching on
Event::getIdvirtual function is clunky and doesn't benefit from type checking. - This style encourages a bloated
onEventfunction when handling many different event types.
Consider this code:
class Foo : public EventListener<AEvent, BEvent> {
/* ... */
void onEvent(const AEvent& evt) {
// ...
}
void onEvent(const BEvent& evt) {
// ...
}
};It's better because:
- The implementation doesn't use run-time type information (check out
events.h) so there's no overhead. - It's explicit and DRY.
It's also type safe -- it will generate friendly compiler errors if you try to misuse it.
I built this using g++ 5.2.0 and the following command: g++ events.h example.cpp -std=c++11 -o example -fno-rtti.
Convince yourself that this doesn't use RTTI by looking at the last option. ;)