Ich bin versucht, einen Beobachter Muster in c zu schreiben ++ so habe ich eine Karte, die Ereignisnamen enthält -> Vektor von Callback-Funktionenein Element aus einem Vektor von std entfernen :: function
Die Callback-Funktionen gespeichert sind, in einem Vektor als
std::function<void(void *)>
so sieht die Karte wie
std::unordered_map<std::string, std::vector<std::function<void(void *)>>>
ich Zuhörer auf den Vektor hinzufügen und empfangen und Ereignisbenachrichtigungen reagieren. Mein Problem ist mit dem Implementieren von Trennen.
Also std :: function's kann nicht verglichen werden, also löschen/entfernen ist out, also wollte ich den Vektor suchen und manuell vergleichen.
fand ich, dass this question hatte Erfolg mit immer Zugriff auf die zugrunde liegende Zeiger std :: Funktion :: Ziel, aber ich kann das nicht verwenden, da ich std :: bind bin mit dem Rückruf zu initialisieren:
std::function<void(void *)> fnCallback = std::bind(&wdog::onBark, this, std::placeholders::_1)
Ich möchte nur die zugrunde liegende Memberfunktion ptrs vergleichen, oder sogar einen Vergleich mit dem zugrunde liegenden Objekt ptr, dem die Elementfunktion zugeordnet ist. Gibt es irgendeinen Weg?
Ich möchte das Mitglied fn ptr in einem Objekt vermeiden Verpackung, die einen Hash enthält, obwohl es so aussieht, muss ich diesen Weg gehen könnte ...
Können Sie ein Beispiel veröffentlichen, wie Sie Elemente aus der Karte hinzufügen/entfernen möchten? – Holt
Es scheint mir, dass Sie bereits die Antwort wissen ... :-) – skypjack
Sie können es nicht wirklich tun, ohne auch einen Zeiger auf das fragliche Objekt zu speichern, um es als Schlüssel zu verwenden. Mein Impl verwendet weak_ptr und überprüft die Sammlung, um abgelaufene() vor dem Absenden des Ereignisses zu entfernen. Attach ist (shared_from_this(), & class :: member), detach ist (shared_from_this()). – Robinson