dado dos casos idénticos boost::variant
a
y b
, la expresión se permite (a == b)
.¿Por qué impulso :: variante no proporciona el operador! =
Sin embargo, (a != b)
parece no estar definido. ¿Por qué es esto?
dado dos casos idénticos boost::variant
a
y b
, la expresión se permite (a == b)
.¿Por qué impulso :: variante no proporciona el operador! =
Sin embargo, (a != b)
parece no estar definido. ¿Por qué es esto?
creo que simplemente no se agrega a la biblioteca. Los operadores de Boost no serán de gran ayuda, ya que cualquiera de las variantes se habría derivado de boost :: operator :: equality_comparable. David Pierre tiene razón al decir que puede usar eso, pero su respuesta también es correcta, ¡que el nuevo operador! = No lo encontrará ADL, por lo que necesitará un operador que lo use.
Preguntaría esto en la lista de correo de boost-users.
Editar en el comentario de @ AFoglia:
Siete meses más tarde, y estoy estudiando Boost.Variant, y tropezar con esta explicación mejor de las listas de omisión.
http://boost.org/Archives/boost/2006/06/105895.php
operator==
llamadas operator==
para la clase real actualmente en la variante. Del mismo modo, llamando al operator!=
también debe llamar al operator!=
de la clase. (Porque, teóricamente, una clase se puede definir de modo que a!=b
no es lo mismo que !(a==b)
). De modo que se agregaría otro requisito de que las clases en la variante tengan un operator!=
. (Hay un debate sobre si se puede hacer esta suposición en el hilo lista de correo.)
Siete meses después, y estoy estudiando Boost.Variant, y me tropiezo con esta mejor explicación de la omisión http://lists.boost.org/Archives/boost/2006/06/105895.php. El operador == llama al operador == para la clase actual actualmente en la variante. ¡Igualmente llamando al operador! = También debería llamar al operador! = De la clase. (Porque, teóricamente, una clase puede definirse de modo que a! = B no es lo mismo que! (A == b).) ¡Así que eso agregaría otro requisito de que las clases en la variante tienen un operador! =. (Existe un debate sobre si puede hacer esta suposición en el hilo de la lista de correo). – AFoglia
Porque no es necesario.
Boost tiene un operators library que define el operador! = En términos de operador ==
Podría estar equivocado. Pero si la variante usa la biblioteca de operadores, ¿no significa eso que a! = B * debería * funcionar? Creo que lo que él quiere es usar std :: rel_ops en su lugar: {using std :: rel_ops :: operator! =; getA()! = getB(); } –
No quise decir que la variante está usando la lib, pero que puede hacerlo usted mismo para inyectar el operador! = –
Entonces la expectativa es incluir un encabezado adicional y agregar una declaración de uso en los archivos fuente donde! = Es ¿deseado? –
Ésta es a link to the answer from the author himself cuando esta pregunta se formuló en la lista de impulso de correo
Resumiendo que, en opinión del autor, la aplicación de los operadores de comparación (! = y <) agregaría más requisitos en los tipos utilizados para crear el tipo de variante.
No estoy de acuerdo con su punto de vista, sin embargo, desde entonces! = Puede ser implementado en la misma forma que ==, sin ocultar necesariamente las posibles implementaciones de estos operadores para cada uno de los tipos que componen la variante
(! (A == b)) == (a! = B) – dragonfly
En mi sentido es porque '==' es necesario para contención 'map', (así como' hash_value') pero operator! = Es de lujo :) –