Espacios de nombres
Variantes
Acciones

operator==, !=, <, <=, >, >=, <=>(std::variant)

De cppreference.com
< cpp‎ | utility‎ | variant
 
 
Biblioteca de servicios
 
std::variant
Funciones miembro
Observadores
Modificadores
Funciones no miembro
operator==operator!=operator<operator<=operator>operator>=operator<=>
(C++20)
Clases auxiliares
Objetos auxiliares
 
Definido en el archivo de encabezado <variant>
template<class... Types>

constexprbool operator==(conststd::variant<Types...>& v,

                           conststd::variant<Types...>& w );
(1) (desde C++17)
template<class... Types>

constexprbool operator!=(conststd::variant<Types...>& v,

                           conststd::variant<Types...>& w );
(2) (desde C++17)
template<class... Types>

constexprbool operator<(conststd::variant<Types...>& v,

                          conststd::variant<Types...>& w );
(3) (desde C++17)
template<class... Types>

constexprbool operator>(conststd::variant<Types...>& v,

                          conststd::variant<Types...>& w );
(4) (desde C++17)
template<class... Types>

constexprbool operator<=(conststd::variant<Types...>& v,

                           conststd::variant<Types...>& w );
(5) (desde C++17)
template<class... Types>

constexprbool operator>=(conststd::variant<Types...>& v,

                           conststd::variant<Types...>& w );
(6) (desde C++17)
template<class... Types>

constexprstd::common_comparison_category_t<
    std::compare_three_way_result_t<Types>...>
    operator<=>(conststd::variant<Types...>& v,

                 conststd::variant<Types...>& w );
(7) (desde C++20)
1) Operador de igualdad para variantes:
  • Si v.index()!= w.index(), devuelve false;
  • de lo contrario, si v.valueless_by_exception(), devuelve true;
  • de lo contrario, devuelve std::get<v.index()>(v)==std::get<v.index()>(w). El comportamiento está indefinido(hasta C++20)El programa está mal formado(desde C++20) si std::get<i>(v)==std::get<i>(w) no es una expresión válida que devuelve un tipo convertible a bool para cualquier i.
2) Operador de desigualdad para variantes:
  • Si v.index()!= w.index(), devuelve true;
  • de lo contrario, si v.valueless_by_exception(), devuelve false;
  • de contrario, devuelve std::get<v.index()>(v)!=std::get<v.index()>(w). El comportamiento está indefinido(hasta C++20)El programa está mal formado(desde C++20) si std::get<i>(v)!=std::get<i>(w) no es una expresión válida que devuelve un tipo convertible a bool para cualquier i.
3) Operador menor que para variantes:
  • Si w.valueless_by_exception(), devuelve false;
  • de lo contrario, si v.valueless_by_exception(), devuelve true;
  • de lo contrario, si v.index()< w.index(), devuelve true;
  • de lo contrario, si v.index()> w.index(), devuelve false;
  • de contrario, devuelve std::get<v.index()>(v)<std::get<v.index()>(w). El comportamiento está indefinido(hasta C++20)El programa está mal formado(desde C++20) si std::get<i>(v)<std::get<i>(w) no es una expresión válida que devuelve un tipo convertible a bool para cualquier i.
4) Operador mayor que para variantes:
  • Si v.valueless_by_exception(), devuelve false;
  • de lo contrario, si w.valueless_by_exception(), devuelve true;
  • de lo contrario, si v.index()> w.index(), devuelve true;
  • de lo contrario, si v.index()< w.index(), devuelve false;
  • de contrario, devuelve std::get<v.index()>(v)>std::get<v.index()>(w). El comportamiento está indefinido(hasta C++20)El programa está mal formado(desde C++20) si std::get<i>(v)>std::get<i>(w) no es una expresión válida que devuelve un tipo convertible a bool para cualquier i.
5) Operador menor o igual que para variantes:
  • Si v.valueless_by_exception(), devuelve true;
  • de lo contrario, si w.valueless_by_exception(), devuelve false;
  • de lo contrario, si v.index()< w.index(), devuelve true;
  • de lo contrario, si v.index()> w.index(), devuelve false;
  • de contrario, devuelve std::get<v.index()>(v)<=std::get<v.index()>(w). El comportamiento está indefinido(hasta C++20)El programa está mal formado(desde C++20) si std::get<i>(v)<=std::get<i>(w) no es una expresión válida que devuelve un tipo convertible a bool para cualquier i.
6) Operador mayor o igual que para variantes:
  • Si w.valueless_by_exception(), devuelve true;
  • de lo contrario, si v.valueless_by_exception(), devuelve false;
  • de lo contrario, si v.index()> w.index(), devuelve true;
  • de lo contrario, si v.index()< w.index(), devuelve false;
  • de contrario, std::get<v.index()>(v)>=std::get<v.index()>(w).El comportamiento está indefinido(hasta C++20)El programa está mal formado(desde C++20) si std::get<i>(v)>=std::get<i>(w) no es una expresión válida que devuelve un tipo convertible a bool para cualquier i.
7) Operador de comparación de tres vías para variantes:
  • Si tanto v.valueless_by_exception() como w.valueless_by_exception() son true, devuelve std::strong_ordering::equal;
  • de lo contrario, si v.valueless_by_exception() es true, devuelve std::strong_ordering::less;
  • de lo contrario, si w.valueless_by_exception() es true, devuelve std::strong_ordering::greater;
  • de lo contrario, si v.index()!= w.index(), devuelve v.index()<=> w.index();
  • de contrario, es equivalente a std::get<v.index()>(v)<=>std::get<v.index()>(w).

Contenido

[editar]Parámetros

v,w - Variantes a comparar.

[editar]Valor de retorno

El resultado de la comparación como se describe más arriba.

[editar]Ejemplo

#include <iostream>#include <string>#include <variant>   int main(){std::cout<<std::boolalpha;std::string cmp;bool result;   auto print2 =[&cmp, &result](constauto& lhs, constauto& rhs){std::cout<< lhs <<' '<< cmp <<' '<< rhs <<" : "<< result <<'\n';};   std::variant<int, std::string> v1, v2;   std::cout<<"operator==\n";{ cmp ="==";   // by default v1 = 0, v2 = 0; result = v1 == v2;// verdaderostd::visit(print2, v1, v2);   v1 = v2 =1; result = v1 == v2;// verdaderostd::visit(print2, v1, v2);   v2 =2; result = v1 == v2;// falsostd::visit(print2, v1, v2);   v1 ="A"; result = v1 == v2;// falso: v1.index == 1, v2.index == 0std::visit(print2, v1, v2);   v2 ="B"; result = v1 == v2;// falsostd::visit(print2, v1, v2);   v2 ="A"; result = v1 == v2;// verdaderostd::visit(print2, v1, v2);}   std::cout<<"operator<\n";{ cmp ="<";   v1 = v2 =1; result = v1 < v2;// falsostd::visit(print2, v1, v2);   v2 =2; result = v1 < v2;// verdaderostd::visit(print2, v1, v2);   v1 =3; result = v1 < v2;// falsostd::visit(print2, v1, v2);   v1 ="A"; v2 =1; result = v1 < v2;// falso: v1.index == 1, v2.index == 0std::visit(print2, v1, v2);   v1 =1; v2 ="A"; result = v1 < v2;// verdadero: v1.index == 0, v2.index == 1std::visit(print2, v1, v2);   v1 = v2 ="A"; result = v1 < v2;// falsostd::visit(print2, v1, v2);   v2 ="B"; result = v1 < v2;// verdaderostd::visit(print2, v1, v2);   v1 ="C"; result = v1 < v2;// falsostd::visit(print2, v1, v2);}   {std::variant<int, std::string> v1;std::variant<std::string, int> v2;// v1 == v2; // error de compilación: no hay conversión}   // TODO: operación de comparación de tres vías <=> de C++20 para variantes}

Salida:

operator== 0 == 0 : true 1 == 1 : true 1 == 2 : false A == 2 : false A == B : false A == A : true operator< 1 < 1 : false 1 < 2 : true 3 < 2 : false A < 1 : false 1 < A : true A < A : false A < B : true C < B : false

[editar]Véase también

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
Compara objetos opcionales (optional).
(plantilla de función)[editar]
close