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 einemstd::functionverglichen wird, und schon gar nicht was für ein Typ in diesem anderenstd::functiondann stecken wird.Maximal könnte man noch Vergleiche erlauben wenn beide
std::functionden exakt selben Typ enthalten. Nur sogar da hätte man einen blöden Fall den man erst zur Laufzeit erkennt. Nämlich wenn die zweistd::functionzwar den selben Typ enthalten, dieser aber gar nicht mit sich selbst vergleichbar ist. Das müsste man dann zur Laufzeit behandeln.falsezurückgeben? Exception werfen? Universum zerstören?Insgesamt würden sich Vergleiche mit
std::functionalso deutlich anders verhalten, als Vergleiche der gespeicherten Typen. Und ich denke genau das ist der Grund warumstd::functiondiese 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::functionzwar 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 mittypeid()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.