class DoubleEvent: public Event { public: DoubleEvent(double d): d_(d) {} double d() const {return d_ ;} public: double d_ ; } ; class S: public Subscriber { public: void event(DoubleEvent* e) {std::cerr << "d = " << e->d() << std::endl ;} } ; class SFilter: public EventFilter { public: SFilter(double limit): limit_(limit) {} virtual bool filter(Event* e) { DoubleEvent* ee = dynamic_cast<DoubleEvent*>(e) ; if (ee && ee->d()>=limit_) return false ; return true ; } private: double limit_ ; } ; int main() { Publisher* p = new Publisher ; S* s = new S ; igs_connect(p, s, igs_functor(s, S::event)) ; // Add the filter not to S but to the Listener Listener* l = igs_get_listener(p, s, igs_functor(s, S::event)) ; assert( l != NULL) ; l->add_event_filter(new SFilter(100)) ; p->igs_emit(DoubleEvent(50)) ; p->igs_emit(DoubleEvent(99)) ; p->igs_emit(DoubleEvent(100)) ; // never received p->igs_emit(DoubleEvent(200)) ; // never received p->igs_emit(DoubleEvent(1)) ; }Will print:
50 99 1