einen Blick auf dem Observer-Muster nehmen. Sie könnten Ihren Booleschen Wert in eine Hilfsklasse einfügen, die jedes Mal, wenn der Boolesche Wert gesetzt wird, ein Ereignis auslöst.
Beispiel Implementierung eines beobachtbaren Bool:
#include <vector>
class Observer {
public:
virtual void valueChanged() = 0;
};
class ObservableBool {
private:
bool value;
std::vector<Observer*> observers = std::vector<Observer*>();
public:
bool getValue() {
return value;
}
bool setValue(bool value) {
bool changed = (value != this->value);
this->value = value;
if(changed) raiseEvent();
}
void addObserver(Observer* observer) {
observers.push_back(observer);
}
void removeObserver(Observer* observer) {
observers.erase(std::find(observers.begin, observers.end, observer));
}
private:
void raiseEvent() {
for (int i = 0; i < observers.size; ++i) {
observers[i]->valueChanged();
}
}
};
Dies kann eine Menge verbessert werden. Ein wirklich netter Weg wäre es, implizite Konvertierung von und nach bool zu implementieren (Aber Vorsicht, das Überladen des '=' Operators für bool könnte gefährlich sein). Sie könnten es zur Unterstützung beliebiger Typen anstelle von bool simulieren, Sie sollten einen intelligenten Zeiger anstelle von rohen Zeigern verwenden (std::weak_ptr
wäre am besten) und statt einer Observer-Klasse sollten Sie wahrscheinlich Funktionszeiger verwenden, um lambdas richtig zu unterstützen. Wenn Sie es richtig machen, können Sie die Klasse wie einen normalen booleschen Wert verwenden, mit einem kleinen Overhead, wenn ein neuer Wert gesetzt wird. Und standardmäßig werden alle Reaktionen auf eine Änderung von dem Thread ausgeführt, der den Wert geändert hat.
Lookup für [ 'std :: condition_variable'] (http://en.cppreference.com/w/cpp/thread/condition_variable) –