2009-06-25 8 views
15

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?

+0

(! (A == b)) == (a! = B) – dragonfly

+0

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 :) –

Répondre

11

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.)

+4

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

2

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 ==

+2

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(); } –

+0

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! = –

+0

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? –

2

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

Questions connexes