Ich implementiere meinen eigenen signal
/Schlitz (Observer Muster, Qt Stil) Mechanismus, so dass ich eine property
haben kann, die benachrichtigt ... Zeug ... das hat sich geändert.Implementieren von Signalen (Beobachtermuster): ist veränderbar oder const_cast notwendig?
Ich denke, C++ 11 bietet alles, was notwendig ist, um eine sehr erfolgreiche und funktionsreiche Implementierung zu ermöglichen. Das "Problem", auf das ich stoße, ist, wenn ich mit einem Signal eines const
Objekts "verbinden" möchte, brauche ich die signal::connect
Funktion, const zu sein, aber die Liste der Rückrufe/Beobachter zu ändern. Es gibt zwei einfache Möglichkeiten, dies zu beheben:
const_cast
die Listen innerhalbconnect
.- Machen Sie die Listen
mutable
.
Beide scheinen mir wie die gleiche Sache (und dies vor, zum Beispiel in this question gefragt wurde), und völlig in Ordnung, logisch, aber stilistisch fragwürdig. Daher die Frage. Gibt es einen Weg um dies oder ist dies eine wirklich begründete Verwendung von const_cast
/?
Einige prelimenary Code, wie ich es haben jetzt:
template<typename... ArgTypes>
class signal
{
public:
template<typename Callable>
void connect(Callable&& callback) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
slots.emplace_back(callback);
}
void emit(ArgTypes... arguments) const
{
std::lock_guard<std::mutex> lock(slots_mutex);
for(auto&& callback : slots)
{
callback(arguments...);
}
}
private:
// mutable here allows to connect to a const object's signals
mutable std::vector<std::function<void(ArgTypes...)>> slots;
std::mutex slots_mutex;
};
Hinweis ich diesen Code nicht getestet; Dies ist nur eine Reflektion meines momentanen Gemütszustandes.
Nicht getesteter Code ... tsk tsk ... –
@Arnav Ich schreibe jetzt buchstäblich die Tests, ich musste nur dieses Designproblem aus dem Weg räumen: p. – rubenvb
Ich fürchte, ich verstehe nicht, warum das 'Signal' selbst' const' Methoden offenlegen sollte. Warum sollte der Benutzer von 'signal' nicht entscheiden, ob er veränderbar (oder nicht) sein will? –