// // Created by YY on 2023/3/30. // #ifndef MYAPPLICATION3_OBSERVER_H #define MYAPPLICATION3_OBSERVER_H #include #include #include #include namespace ilovers { class NonCopyable { protected: NonCopyable() = default; ~NonCopyable() = default; NonCopyable(const NonCopyable &) = delete; NonCopyable &operator=(const NonCopyable &) = delete; }; template class Observer : NonCopyable { public: Observer() {} ~Observer() {} int Connect(Func &&f) { return Assgin(f); } int Connect(const Func &f) { return Assgin(f); } void Disconnect(int key) { m_connections.erase(key); } template void Notify(Args &&... args) { for (auto &it: m_connections) { it.second(std::forward(args)...); } } private: template int Assgin(F &&f) { int k = m_observerId++; m_connections.emplace(k, std::forward(f)); return k; } int m_observerId = 0; std::map m_connections; }; } #endif //MYAPPLICATION3_OBSERVER_H