Lazy, überladener C ++ && Operator?

8

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.

    
user2285449 16.04.2013, 08:07
quelle

4 Antworten

15

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.

    
juanchopanza 16.04.2013, 08:10
quelle
4
  

Gibt es eine Möglichkeit, überladen zu machen & amp; & amp; faul?

Nein.

    
Tony Delroy 16.04.2013 08:10
quelle
2

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.

    
Steve Jessop 16.04.2013 09:29
quelle
0

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.

%Vor%

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.

    
dshin 01.01.2016 15:21
quelle