#ifndef SIGNAL_SLOT_H_ #define SIGNAL_SLOT_H_ #include class Slot0 { public: virtual void action() = 0; }; template class Slot1 { public: virtual void action(T elem1) = 0; }; template class Slot2 { public: virtual void action(T elem1, H elem2) = 0; }; template class Slot3 { public: virtual void action(T elem1, H elem2, K elem3) = 0; }; class Signal0 { public: void emit() { for(Slot0 * slot: _slots) { slot->action(); } } void connectSlot(Slot0 * slot) { _slots.push_back(slot); } private: std::list _slots; }; template class Signal1 { public: void emit(T elem1) { for(Slot1 * slot: _slots) { slot->action(elem1); } } void connectSlot(Slot1 * slot) { _slots.push_back(slot); } private: std::list *> _slots; }; template class Signal2 { public: void emit(T elem1, H elem2) { for(Slot2 * slot: _slots) { slot->action(elem1, elem2); } } void connectSlot(Slot2 * slot) { _slots.push_back(slot); } private: std::list *> _slots; }; template class Signal3 { public: void emit(T elem1, H elem2, K elem3) { for(Slot3 * slot: _slots) { slot->action(elem1, elem2, elem3); } } void connectSlot(Slot3 * slot) { _slots.push_back(slot); } private: std::list *> _slots; }; #endif