8
votes

Paresseux, surchargé C ++ && opérateur?

J'essaie de mettre en œuvre ma propre classe booléenne, mais je ne peux pas reproduire la sémantique indigène pour &&. Le code de contreveille suivant démontre le problème: xxx

Lors de la compilation et de l'exécution, le résultat est le suivant: xxx

en d'autres termes, && sur bools est paresseux (comme tout programmeur C ++ s'attendrait), mais le surchargé et& ce n'est pas (comme ce programmeur C ++ ne s'attendait-t-il pas au moins).

est là un moyen de faire surchargé && paresseux? Je peux trouver divers systèmes d'évaluation paresseux complètes pour fournir des fonctionnalités de type Haskell, mais elles semblent être une overkill complète pour mon étui d'utilisation.


3 commentaires

Par paresseux, vous voulez dire court-circuit. Les opérateurs surchargés n'ont pas de court-circuit.


Ce problème est exactement pourquoi il est recommandé de ne pas surcharger l'opérateur && .


Notez que la raison pour laquelle l'opérateur surchargé ne peut pas court-circuiter, c'est que mybool Abool est transmis en tant que paramètre. Donc mybool (F2 ()) doit être calculé avant la mise en œuvre de opérateur && a une chance de courir. En théorie, vous pouvez écrire un modèle opérateur && surcharge dont le rhs est un foncteur qui retourne mybool . Appelez ensuite ce foncteur uniquement si le LHS évalue le vrai. Ensuite, dans C ++ 11 appelants pourraient écrire un Lambda: mybool (F1 ()) && [] () {retour mybool (F2 ()); } . Mais dans la pratique, ne faites pas cela - l'évaluation paresseuse est assez laide lorsque vous devez le préciser explicitement sur chaque appel.


4 Réponses :


15
votes

Vous ne devez pas surcharger bool opérateur && , puisque vous perdez une évaluation de court-circuit, comme vous l'avez découvert.

L'approche correcte serait de donner à votre opérateur de conversion BOOL de classe A xxx

Notez que les opérateurs de conversion explicite nécessitent une conformité C ++ 11. Si vous ne l'avez pas, consultez le Safe Bool Idiom .


1 commentaires

+1, mais il convient de noter que opérateur explicite s est une fonctionnalité C ++ 11, et C ++ 03 nécessite l'idiome de Bool Safe Bool.



5
votes

Y a-t-il un moyen de faire surchargé && paresseux?

non.


0 commentaires


0
votes

Si vous voulez vraiment un court-circuit et que vous soyez prêt à sacrifier la syntaxe de l'opérateur, vous pouvez renommer votre méthode opérateur && à et , définissez un et () macro et écrivez et (x, y) au lieu de x && y . xxx

avec un Macro Hacks Vous pouvez avoir et () Accepter un nombre variable de paramètres.

Le < code> _et () méthode ici n'est pas destiné à être utilisé "publiquement" ici mais doit être déclaré public depuis que vous ne pouvez pas ami macro.

pour Quelque chose aussi simple que votre classe mybool , cela est probablement inutile. Mais si vous avez besoin de votre opérateur && pour avoir des effets secondaires spéciaux, comme la mise à jour de certains états sur Ceci , cela obtient alors le travail effectué.


0 commentaires