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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top