std:.function vergleichen



  • Hallo zusammen,

    gibt es eine Möglichkeit, std::function Objekte zu vergleichen und eindeutig zu identifizieren? Ich möchte ein Publisher/Subscriber mit std::function implementieren, aber es scheitert im Moment daran, dass sich ein Subscriber nicht austragen kann, weil einzelne std::function Objekte nicht identifizierbar (bzw. untereinander vergleichbar) sind. Der operator== prüft nur gegen nullptr , kann aber nicht feststellen, ob zwei std::function Objekte die gleiche Funktion/Methode enthalten. Damit stellen sich zwei Probleme:

    1. ich kann nicht prüfen, ob ein sich Duplikat bereits im vector befindet
    2. ich kann kein Objekte im vector eindeutig identifizieren, um sie zu entfernen.

    Hier ist eine kurze Erläuterung, warum das mit boost::function nicht 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.


Anmelden zum Antworten