ModernCPlusPlusDemo
载入中...
搜索中...
未找到
Observer.hpp
浏览该文件的文档.
1// Observer.hpp
2#pragma once
3
4#include <algorithm>
5#include <exception>
6#include <functional>
7#include <iostream>
8#include <memory>
9#include <mutex>
10#include <optional>
11#include <shared_mutex>
12#include <vector>
13
14template<typename... Args>
16{
17public:
18 using Observer = std::function<void(Args...)>;
19 using ObserverId = size_t;
20
22 {
23 std::unique_lock<std::shared_mutex> lock(mutex_);
25 observers_.emplace_back(ObserverWrapper{std::move(observer), id});
26 return id;
27 }
28
30 {
31 std::unique_lock<std::shared_mutex> lock(mutex_);
32 auto it = std::find_if(observers_.begin(), observers_.end(), [id](const auto& obs) { return obs.id == id; });
33 if (it != observers_.end())
34 {
35 observers_.erase(it);
36 return true;
37 }
38 return false;
39 }
40
41 void notify(Args... args) const
42 {
43 std::vector<ObserverWrapper> observersCopy;
44 {
45 std::shared_lock<std::shared_mutex> lock(mutex_);
46 observersCopy = observers_;
47 }
48
49 for (const auto& observer : observersCopy)
50 {
51 try
52 {
53 observer.callback(args...);
54 }
55 catch (const std::exception& e)
56 {
57 std::cerr << "Exception in observer " << observer.id << ": " << e.what() << std::endl;
58 }
59 catch (...)
60 {
61 std::cerr << "Unknown exception in observer " << observer.id << std::endl;
62 }
63 }
64 }
65
67 {
68 std::unique_lock<std::shared_mutex> lock(mutex_);
69 observers_.clear();
70 }
71
72 size_t observerCount() const
73 {
74 std::shared_lock<std::shared_mutex> lock(mutex_);
75 return observers_.size();
76 }
77
78 std::optional<ObserverId> findObserver(const Observer& observer) const
79 {
80 std::shared_lock<std::shared_mutex> lock(mutex_);
81 auto it = std::find_if(observers_.begin(), observers_.end(),
82 [&](const auto& obs) { return obs.callback.target_type() == observer.target_type(); });
83 if (it != observers_.end())
84 {
85 return it->id;
86 }
87 return std::nullopt;
88 }
89
90private:
96
97 mutable std::shared_mutex mutex_;
98 std::vector<ObserverWrapper> observers_;
100};
101
102//===========================Usage example=========================================
103// #include <iostream>
104
105// class WeatherStation : public Subject<float, float>
106// {
107// public:
108// void setMeasurements(float temperature, float humidity)
109// {
110// notify(temperature, humidity);
111// }
112// };
113
114// int main()
115// {
116// WeatherStation station;
117
118// auto observer1 = [](float temp, float humidity)
119// {
120// std::cout << "Observer 1: Temperature: " << temp << "C, Humidity: " << humidity << "%" << std::endl;
121// };
122
123// auto observer2 = [](float temp, float humidity)
124// {
125// std::cout << "Observer 2: Temperature: " << temp << "C, Humidity: " << humidity << "%" << std::endl;
126// throw std::runtime_error("Test exception");
127// };
128
129// auto id1 = station.addObserver(observer1);
130// auto id2 = station.addObserver(observer2);
131
132// std::cout << "Observer count: " << station.observerCount() << std::endl;
133
134// station.setMeasurements(25.5, 60);
135
136// if (auto foundId = station.findObserver(observer1); foundId)
137// {
138// std::cout << "Found observer1 with id: " << *foundId << std::endl;
139// station.removeObserver(*foundId);
140// }
141
142// std::cout << "Observer count after removal: " << station.observerCount() << std::endl;
143
144// station.setMeasurements(26.0, 61);
145
146// station.clearObservers();
147
148// std::cout << "Observer count after clear: " << station.observerCount() << std::endl;
149
150// return 0;
151// }
Definition Observer.hpp:16
std::vector< ObserverWrapper > observers_
Definition Observer.hpp:98
bool removeObserver(ObserverId id)
Definition Observer.hpp:29
std::optional< ObserverId > findObserver(const Observer &observer) const
Definition Observer.hpp:78
ObserverId addObserver(Observer observer)
Definition Observer.hpp:21
std::shared_mutex mutex_
Definition Observer.hpp:97
size_t ObserverId
Definition Observer.hpp:19
void notify(Args... args) const
Definition Observer.hpp:41
ObserverId nextObserverId_
Definition Observer.hpp:99
size_t observerCount() const
Definition Observer.hpp:72
void clearObservers()
Definition Observer.hpp:66
std::function< void(Args...)> Observer
Definition Observer.hpp:18
Definition Observer.hpp:92
Observer callback
Definition Observer.hpp:93
ObserverId id
Definition Observer.hpp:94