std::function mit Funktionszeiger vergleichen?



  • @Finnegan sagte in std::function mit Funktionszeiger vergleichen?:

    Alternativ hätte std::function::operator== (der nur mit nullptr vergleichen kann) auch Vergleiche zwischen zwei std::function erlauben können, wenn zwischen deren Callable-Typen ein operator== definiert ist.

    Wie soll das gehen?
    Bei der Zuweisung weiss der Compiler ja nicht dass dann später evtl. mit einem std::function verglichen wird, und schon gar nicht was für ein Typ in diesem anderen std::function dann stecken wird.

    Maximal könnte man noch Vergleiche erlauben wenn beide std::function den exakt selben Typ enthalten. Nur sogar da hätte man einen blöden Fall den man erst zur Laufzeit erkennt. Nämlich wenn die zwei std::function zwar den selben Typ enthalten, dieser aber gar nicht mit sich selbst vergleichbar ist. Das müsste man dann zur Laufzeit behandeln. false zurückgeben? Exception werfen? Universum zerstören?

    Insgesamt würden sich Vergleiche mit std::function also deutlich anders verhalten, als Vergleiche der gespeicherten Typen. Und ich denke genau das ist der Grund warum std::function diese Vergleiche nicht implementiert.

    Als Ersatz dafür gibt es halt target(). Damit kann man dann bestimmte Vergleiche selbst implementieren. Das vermeidet Überraschungen.



  • @hustbaer Oh Mann! Danke für die hartnäckige Nachhilfe. Jetzt ist bei mir endlich der Groschen gefallen, dass std::function zwar die Funktionssignatur in ihrem Typ speichert, aber dennoch eine Type Erasure macht und zur Laufzeit an verschiedene Typen binden kann, welche die selbe Signatur unterstützen. Ich hätte mich ja auch fragen können, warum überhaupt mit typeid() gearbeitet wird. Sorry, manchmal bin ich echt ein Holzkopf 😳 ... ich dachte echt die kennt ihre statischen Typen und könnte einfach zur Compile-Zeit schauen, ob ein operator==(T_LHS, T_RHS) existiert.


Anmelden zum Antworten