| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #include <functional>
- #include <vector>
- #include <map>
- #include <iostream>
- template <class... Params>
- class Event
- {
- public:
- template <class T>
- using MemberPtr = void (T::*)(Params...);
- using Callback = std::function<void(Params...)>;
- template <class T>
- void
- Subscribe(T* t, MemberPtr<T> m)
- {
- const auto lambda = [=](Params&&... params) { (t->*m)(std::forward<Params>(params)...); };
- Addcallback(lambda);
- }
- void
- Notify(Params&&... params) const
- {
- for (const auto& callback : mCallbacks)
- {
- callback(std::forward<Params>(params)...);
- }
- }
- private:
- void
- Addcallback(Callback callback)
- {
- mCallbacks.emplace_back(callback);
- }
- std::vector<Callback> mCallbacks;
- std::map<int, Callback> mCall_map;
- };
- struct EventListener
- {
- void
- eventListenerCallback(int i)
- {
- std::cout << "Received " << i << std::endl;
- }
- };
- struct DoublingListener
- {
- void
- eventListenerCallback(int i, int y)
- {
- std::cout << "Double of received value " << i * 2 << std::endl;
- }
- };
- int
- main()
- {
- Event<int> event;
- Event<int,int> eventD;
- EventListener listener;
- DoublingListener doublingListener;
- event.Subscribe(&listener, &EventListener::eventListenerCallback);
- eventD.Subscribe(&doublingListener, &DoublingListener::eventListenerCallback);
- event.Notify(1337);
- return 0;
- }
|