#include <iostream>
#include <vector>
#include <memory>
#include <functional>
#include <algorithm>
#include <mutex>
#include <stdexcept>
#include <cassert>
// 定义事件类型
template<typename... Args>
class Event {
public:
using Listener = std::function<void(Args...)>;
void AddListener(const std::shared_ptr<Listener>& listener) {
assert(listener != nullptr);
std::lock_guard<std::mutex> lock(m_Mutex);
m_Listeners.emplace_back(listener);
}
void RemoveListener(const std::shared_ptr<Listener>& listener) {
std::lock_guard<std::mutex> lock(m_Mutex);
m_Listeners.erase(std::remove_if(m_Listeners.begin(), m_Listeners.end(),
[&](const std::shared_ptr<Listener>& l) { return l && l.get() == listener.get(); }), m_Listeners.end());
}
void Emit(Args... args) const {
std::vector<std::shared_ptr<Listener>> listenersCopy;
{
std::lock_guard<std::mutex> lock(m_Mutex);
listenersCopy = m_Listeners;
}
for (const auto& listener : listenersCopy) {
if (listener) {
try {
(*listener)(args...);
}
catch (const std::exception& ex) {
std::cerr << "Exception caught while emitting event: " << ex.what() << std::endl;
}
}
}
}
private:
std::vector<std::shared_ptr<Listener>> m_Listeners;
mutable std::mutex m_Mutex;
};
// 定义一个简单的类
class MyClass {
public:
Event<int> MyEvent;
void DoSomething(int arg) {
std::cout << "Doing something with " << arg << std::endl;
MyEvent.Emit(arg);
}
};
// 定义一个监听器
class MyListener {
public:
void OnMyEvent(int arg) {
std::cout << "Received MyEvent with argument " << arg << std::endl;
}
};
int main() {
MyClass obj;
MyListener listener;
// 绑定监听器到事件
obj.MyEvent.AddListener(std::make_shared<Event<int>::Listener>([&](int arg) { listener.OnMyEvent(arg); }));
// 触发事件
obj.DoSomething(7);
// 移除监听器
obj.MyEvent.RemoveListener(std::make_shared<Event<int>::Listener>([&](int arg) { listener.OnMyEvent(arg); }));
return 0;
}
【C++】事件机制
最新推荐文章于 2024-05-15 02:17:13 发布