std:.function vergleichen
-
Hallo zusammen,
gibt es eine Möglichkeit,
std::functionObjekte zu vergleichen und eindeutig zu identifizieren? Ich möchte ein Publisher/Subscriber mitstd::functionimplementieren, aber es scheitert im Moment daran, dass sich ein Subscriber nicht austragen kann, weil einzelnestd::functionObjekte nicht identifizierbar (bzw. untereinander vergleichbar) sind. Deroperator==prüft nur gegennullptr, kann aber nicht feststellen, ob zweistd::functionObjekte die gleiche Funktion/Methode enthalten. Damit stellen sich zwei Probleme:- ich kann nicht prüfen, ob ein sich Duplikat bereits im vector befindet
- ich kann kein Objekte im vector eindeutig identifizieren, um sie zu entfernen.
Hier ist eine kurze Erläuterung, warum das mit
boost::functionnicht geht.Kennt jemand vielleicht doch eine Lösung?
-
DocShoe schrieb:
Kennt jemand vielleicht doch eine Lösung?
Nicht direkt. boost::signals2?
-
Speicher halt rohe Funktionszeiger, wenn du das so machen willst.
-
Bei boost::signals2 muss ich mal gucken, wie sich das genau verhält. Ich habe den Fall, dass sich eSubscriber während der Benachrichtigung aus der Liste der Subscriber austragen, das muss boost::signals2 verkraften.
Rohe Pointer speichere ich jetzt, davon möchte ich aber weg.
-
so einfach ist es nicht mit std::function alleine - u.a. auch deshalb, weil du ja ganz einfach neue std::functions mit std::bind erzeugen kannst. niemand wird function jemals ein equalitycomparable verpassen.
das gesagt hast du natürlich noch andere lösungen, wie etwa boost signal (schon erwähnt), oder du implementierst dir einen std::function-wrapper.
generell empfände ich es wohl eher als auch better practice, etwas in der art eines weak_ptrs rund um ein std::function objekt zu haben (das man vor einem callback noch auf die existenz des callback-handlers hin abfragen kann).
-
Oder bei dir halt irgendwie ne eigene Function-Klasse, die intern einen Funktionszeiger hält und du dann die entsprechenden Vergleichsoperatoren definieren kannst.