Salve a tutti,
Ho bisogno di un consiglio.
Sto tentando di sviluppare un event system i cui prerequisiti fondamentali sono:
- Permettere la creazione di eventi personalizzati (che possano trasportare un informazione personalizzata)
- Permettere di effettuare il binding di funzioni all'evento a runtime
Premettendo che non amo i template a causa degli errori osceni che ne possono uscire se vengono usati male e che quindi li uso il meno possibile ho pensato a questo sistema:
Scrivere una classe EvtGen (sta per Event Generator) templatizzata:
template<class EVT>
class EvtGen {
private:
std::vector<std::function<void (EVT &evt)>> subscribers;
public:
void emit(EVT &e) {
for (auto f : subscribers)
f(e);
}
// aggiunta delle funzioni per il bind, unbind e per il check del bind
A questo punto una classe che deve poter generare più eventi può essere scritta così:
class MoreEvents : public EvtGen<Evt1>, public EvtGen<Evt2> {
void methodThatEmitEvt1() {
// inizializzaizione di un oggetto Evt1 chiamato e
emit(e);
}
void methodThatEmitEvt2() {
// inizializzaizione di un oggetto Evt2 chiamato e
emit(e);
}
}
Purtroppo nella mia esperienza non ho mai scritto un sistema del genere e non riesco a valutarne bene i pro ed i contro.
O meglio i pro sono abbastanza semplici:
- Qualsiasi oggetto può essere un evento (potrebbe essere anche un contro)
- Creare dei nuovi eventi è immediato e semplice tanto quanto emetterli
- La comunicazione tra gli event handler è garantita tramite l'uso dell'evento stesso che viene passato come reference
Qualcuno di voi riesce a vedere i contro che a me mancano?
Per esempio è ovvio che un oggetto che voglia emettere 10 o 15 eventi differenti avrebbe un albero di ereditarietà lunghissimo e questo aumenterebbe i tempi di compilazione.