Etant donnés deux boost::variant
identiques instances a
et b
, l'expression (a == b)
est autorisée.Pourquoi boost :: variante ne pas fournir l'opérateur! =
Cependant (a != b)
semble être indéfini. Pourquoi est-ce?
Etant donnés deux boost::variant
identiques instances a
et b
, l'expression (a == b)
est autorisée.Pourquoi boost :: variante ne pas fournir l'opérateur! =
Cependant (a != b)
semble être indéfini. Pourquoi est-ce?
Je pense qu'il est tout simplement pas ajouté à la bibliothèque. Le Boost.Operators ne va pas vraiment aider, parce que l'une ou l'autre variante aurait été dérivée de boost :: operator :: equality_comparable. David Pierre a raison de dire que vous pouvez l'utiliser, mais votre réponse est correcte: le nouvel opérateur! = Ne sera pas trouvé par ADL, vous aurez donc besoin d'un opérateur utilisant.
Je poserais cette question sur la liste de diffusion boost-users.
Modifier de @ commentaire de AFoglia:
Sept mois plus tard, et je suis étudiant Boost.Variant, et je trébuche sur cette meilleure explication des listes d'omission.
http://boost.org/Archives/boost/2006/06/105895.php
operator==
appels operator==
pour la classe réelle actuellement dans la variante. De même, l'appel operator!=
doit également appeler operator!=
de la classe. (Parce que, théoriquement, une classe peut être définie, donc a!=b
n'est pas la même chose que !(a==b)
.) Donc, cela ajouterait une autre exigence que les classes de la variante aient un operator!=
. (Il y a un débat pour savoir si vous pouvez faire cette hypothèse dans le fil de la liste de diffusion.)
Sept mois plus tard, et j'étudie Boost.Variant, et je trébuche sur cette meilleure explication de l'omission http://lists.boost.org/Archives/boost/2006/06/105895.php. L'opérateur == appelle l'opérateur == pour la classe actuelle actuellement dans la variante. De même, l'opérateur appelant! = Devrait aussi appeler l'opérateur! = De la classe. (Parce que, théoriquement, une classe peut être définie donc un! = B n'est pas le même que! (A == b).) Donc, cela ajouterait une autre exigence que les classes de la variante aient un opérateur! =. (Il y a un débat pour savoir si vous pouvez faire cette hypothèse dans le fil de la liste de diffusion.) – AFoglia
Parce que ce n'est pas nécessaire.
Boost a un operators library qui définit l'opérateur! = En terme de l'opérateur ==
Je peux me tromper. Mais si la variante utilise la bibliothèque des opérateurs, cela ne signifie-t-il pas que! = B * devrait * fonctionner? Je pense que ce qu'il veut utiliser std :: rel_ops à la place: {using std :: rel_ops :: operator! =; getA()! = getB(); } –
Je ne voulais pas dire que variant utilise la lib elle-même, mais que vous pouvez le faire vous-même pour injecter l'opérateur! = –
Donc l'attente est d'inclure un en-tête supplémentaire et ajouter une déclaration using dans les fichiers sources où! = Est voulu? –
Ceci est a link to the answer from the author himself lorsque cette question a été formulée sur la liste de diffusion de boost
Résumant il, de l'avis de l'auteur, la mise en œuvre des opérateurs de comparaison (! = et <) ajouterait plus d'exigences sur les types utilisés pour créer le type de variante.
Je ne suis pas d'accord avec son point de vue cependant, puisque! = Peut être mis en œuvre de la même manière que ==, sans nécessairement cacher les implémentations possibles de ces opérateurs pour chacun des types qui composent la variante
(! (A == b)) == (a! = B) – dragonfly
Dans mon sens c'est parce que '==' est nécessaire pour la contenance 'map', (ainsi que' hash_value') mais l'opérateur! = Est de luxe :) –