¿Por qué boost :: variant no proporciona operador! =
-
20-08-2019 - |
Pregunta
Dadas dos boost::variant
instancias idénticas a
y b
, se permite la expresión ( a == b )
.
Sin embargo, ( a != b )
parece no estar definido. ¿Por qué es esto?
Solución
Creo que simplemente no se ha agregado a la biblioteca. El Boost.Operators realmente no ayudará, porque cualquiera de las variantes se habría derivado de boost :: operator :: equal_comparable. David Pierre tiene razón al decir que puede usar eso, pero su respuesta también es correcta, que ADL no encontrará el nuevo operador! =, Por lo que necesitará un operador que use.
Preguntaría esto en la lista de correo de impulsar a los usuarios.
Editar desde el comentario de @ AFoglia:
Siete meses después, y estoy estudiando Boost.Variant, y me tropiezo con esta mejor explicación de las listas de omisión.
http://boost.org/Archives/boost/2006/06/ 105895.php
operator==
llama a operator!=
para la clase actual actualmente en la variante. Del mismo modo, llamar a a!=b
también debería llamar a !(a==b)
de la clase. (Porque, en teoría, una clase se puede definir de modo que <=> no es lo mismo que <=>.) Eso agregaría otro requisito de que las clases en la variante tengan un <=>. (Existe un debate sobre si puede hacer esta suposición en el hilo de la lista de correo).
Otros consejos
Este es un enlace a la respuesta del propio autor cuando esta pregunta se formuló en la lista de correo de impulso
Resumiendo, en opinión del autor, la implementación de operadores de comparación (! = y <) agregaría más requisitos sobre los tipos utilizados para crear el tipo de variante.
Sin embargo, no estoy de acuerdo con su punto de vista, ya que! = se puede implementar de la misma manera que ==, sin ocultar necesariamente las posibles implementaciones de estos operadores para cada uno de los tipos que componen la variante
Porque no es necesario.
Boost tiene una biblioteca de operadores que define operador! = en términos de operador ==