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: Lors de la compilation et de l'exécution, le résultat est le suivant: p> 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). P> 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. P> P>
4 Réponses :
Vous ne devez pas surcharger L'approche correcte serait de donner à votre opérateur de conversion BOOL de classe A P> 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 . P > p> bool opérateur && code>, puisque vous perdez une évaluation de court-circuit, comme vous l'avez découvert.
+1, mais il convient de noter que opérateur explicite code> s est une fonctionnalité C ++ 11, et C ++ 03 nécessite l'idiome de Bool Safe Bool.
Y a-t-il un moyen de faire surchargé && paresseux? p> blockQuote>
non. p>
Vous pouvez faire presque n'importe quoi évaluer la paressole avec Le modèle d'expression idiom a>, y compris mais non limitée aux opérateurs dont les versions intégrées en court-circuit. Mais c'est plus de travail que nécessaire pour ce cas, car votre mybool code> nécessiterait un lot em> plus de code. P>
"Vous pouvez faire presque n'importe quoi d'évaluer la paressoire" - c'est trompeur, car cette approche ne fonctionne que pour coopérer des types définis par l'utilisateur. Par exemple, pour tout t * p; code> et
mybool && ++ p code>, vous ne pouvez pas vous faire court-circuit l'incrément.
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 avec un Macro Hacks Vous pouvez avoir Le < code> _et () code> méthode ici n'est pas destiné à être utilisé "publiquement" ici mais doit être déclaré public depuis que vous ne pouvez pas pour Quelque chose aussi simple que votre classe code> mybool code>, cela est probablement inutile. Mais si vous avez besoin de votre opérateur && code> à
et code>, définissez un
et () code> macro et écrivez
et (x, y) code> au lieu de
x && y code>.
et () code> Accepter un nombre variable de paramètres. P>
ami code> macro. p>
opérateur && code> pour avoir des effets secondaires spéciaux, comme la mise à jour de certains états sur
Ceci code>, cela obtient alors le travail effectué. P> P>
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
&& code>.
Notez que la raison pour laquelle l'opérateur surchargé ne peut pas court-circuiter, c'est que
mybool Abool code> est transmis en tant que paramètre. Donc
mybool (F2 ()) code> doit être calculé avant la mise en œuvre de
opérateur && code> a une chance de courir. En théorie, vous pouvez écrire un modèle
opérateur && code> surcharge dont le rhs est un foncteur qui retourne
mybool code>. 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 ()); } code>. Mais dans la pratique, ne faites pas cela - l'évaluation paresseuse est assez laide lorsque vous devez le préciser explicitement sur chaque appel.