Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <map>
- #include <string>
- #include <vector>
- #include <set>
- using namespace std;
- template<class IListener>
- class ListenerManager
- {
- public:
- void registerListener(IListener* listener)
- {
- listeners.insert(listener);
- }
- void unregisterListener(IListener* listener)
- {
- listeners.erase(listener);
- }
- protected:
- template<class... FuncArgs, class... InvokeArgs>
- void InvokeListener(void (IListener::*function)(FuncArgs...), InvokeArgs... args)
- {
- for (auto listener : listeners)
- (listener->*(function))(args...); // yes, it`s magic!
- }
- private:
- std::set<IListener*> listeners;
- };
- struct IDrigaloListener
- {
- virtual void KatanaZero() = 0;
- virtual void Drigae(int) = 0;
- virtual void NotDrigae(float, char) = 0;
- };
- struct IDrigaloNextGenListener
- {
- virtual void KatanaZero() = 0;
- virtual void Drigae(int) = 0;
- virtual void NotDrigae(float, char) = 0;
- };
- class DrigaloSystem: public ListenerManager<IDrigaloListener>, public ListenerManager<IDrigaloNextGenListener>
- {
- public:
- void CallDrigala()
- {
- InvokeListener(&IDrigaloListener::KatanaZero);
- InvokeListener(&IDrigaloListener::Drigae, 100);
- InvokeListener(&IDrigaloListener::NotDrigae, 0.5, 'a');
- }
- };
- class DrigaloHandler: public IDrigaloListener
- {
- public:
- void KatanaZero() override
- {
- cout << "Katana drigae" << endl;
- }
- void Drigae(int a) override
- {
- cout << "Drigae> " << a << endl;
- }
- void NotDrigae(float a, char b) override
- {
- cout << "Not drigae> " << a << ":" << b << endl;
- }
- };
- class SuperDrigaloHandler : public IDrigaloListener
- {
- public:
- void KatanaZero() override
- {
- cout << "Katana super drigae" << endl;
- }
- void Drigae(int a) override
- {
- cout << "Super drigae> " << a << endl;
- }
- void NotDrigae(float a, char b) override
- {
- cout << "Not super drigae> " << a << ":" << b << endl;
- }
- };
- int main(int argc, char *argv[])
- {
- DrigaloSystem drigalo;
- DrigaloHandler handler1;
- DrigaloHandler handler2;
- SuperDrigaloHandler handler3;
- SuperDrigaloHandler handler4;
- drigalo.registerListener(&handler1);
- drigalo.registerListener(&handler2);
- drigalo.registerListener(&handler3);
- drigalo.registerListener(&handler4);
- drigalo.CallDrigala();
- drigalo.unregisterListener(&handler1);
- drigalo.unregisterListener(&handler2);
- drigalo.unregisterListener(&handler3);
- drigalo.unregisterListener(&handler4);
- getchar();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement