Ich versuche, meine eigene boolesche Klasse zu implementieren, kann aber native Semantiken für & amp; & amp; nicht replizieren. Der folgende erfundene Code demonstriert das Problem:
%Vor%Beim Kompilieren und Ausführen lautet das Ergebnis:
%Vor%Mit anderen Worten, & amp; & amp; auf Bools ist faul (wie jeder C ++ Programmierer erwarten würde), aber die überladenen & amp; & amp; ist nicht (wie dieser C ++ Programmierer zumindest nicht erwartet hat).
Gibt es eine Möglichkeit, überladen zu machen & amp; & amp; faul? Ich kann verschiedene Full-On-Lazy-Evaluierungsschemas finden, um Haskell-ähnliche Funktionalität bereitzustellen, aber sie scheinen für meinen Anwendungsfall vollständig übertrieben zu sein.
Sie sollten bool operator&&
nicht überladen, da Sie die Kurzschlussauswertung verlieren, wie Sie herausgefunden haben.
Der richtige Ansatz wäre, Ihrer Klasse einen bool-Konvertierungsoperator zu geben
%Vor%Beachten Sie, dass explizite Konvertierungsoperatoren C ++ 11-Kompatibilität erfordern. Wenn Sie dies nicht haben, schauen Sie sich das sichere Bool-Idiom an.
Gibt es eine Möglichkeit, überladen zu machen & amp; & amp; faul?
Nein.
Sie können mit die Ausdruckvorlage idiom fast alles lasch auswerten, inklusive aber nicht beschränkt auf die Betreiber, deren eingebaute Versionen kurzschließen. Aber das ist mehr Arbeit, als Sie für diesen einen Fall benötigen, denn dann würde Ihre MyBool
-Klasse einen viel mehr Code benötigen.
Wenn Sie wirklich kurzschließen wollen und bereit sind, die Operator-Syntax zu opfern, können Sie Ihre operator&&
-Methode in _and
umbenennen, ein AND()
-Makro definieren und AND(x,y)
anstelle von x&&y
schreiben.
Bei einigen Makro-Hacks können Sie AND()
eine variable Anzahl von Parametern akzeptieren lassen.
Die Methode _and()
soll hier nicht "öffentlich" verwendet werden, sondern muss als öffentlich deklariert werden, da Sie friend
kein Makro haben können.
Für etwas so einfaches wie Ihre MyBool
-Klasse ist dies wahrscheinlich unnötig. Aber wenn Sie Ihre operator&&
spezielle Nebenwirkungen haben möchten, wie zum Beispiel die Aktualisierung eines Zustandes auf this
, dann erledigt dies die Aufgabe.
Tags und Links c++ lazy-evaluation boolean operator-keyword