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 >

constexpr bool operator==( const std::variant<Types...>& v,

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

constexpr bool operator!=( const std::variant<Types...>& v,

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

constexpr bool operator<( const std::variant<Types...>& v,

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

constexpr bool operator>( const std::variant<Types...>& v,

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

constexpr bool operator<=( const std::variant<Types...>& v,

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

constexpr bool operator>=( const std::variant<Types...>& v,

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

constexpr std::common_comparison_category_t<
    std::compare_three_way_result_t<Types>...>
    operator<=>( const std::variant<Types...>& v,

                 const std::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](const auto& lhs, const auto& 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; // verdadero
        std::visit(print2, v1, v2);
 
        v1 = v2 = 1;
        result = v1 == v2; // verdadero
        std::visit(print2, v1, v2);
 
        v2 = 2;
        result = v1 == v2; // falso
        std::visit(print2, v1, v2);
 
        v1 = "A";
        result = v1 == v2; // falso: v1.index == 1, v2.index == 0
        std::visit(print2, v1, v2);
 
        v2 = "B";
        result = v1 == v2; // falso
        std::visit(print2, v1, v2);
 
        v2 = "A";
        result = v1 == v2; // verdadero
        std::visit(print2, v1, v2);
    }
 
    std::cout << "operator<\n";
    {
        cmp = "<";
 
        v1 = v2 = 1;
        result = v1 < v2; // falso
        std::visit(print2, v1, v2);
 
        v2 = 2;
        result = v1 < v2; // verdadero
        std::visit(print2, v1, v2);
 
        v1 = 3;
        result = v1 < v2; // falso
        std::visit(print2, v1, v2);
 
        v1 = "A"; v2 = 1;
        result = v1 < v2; // falso: v1.index == 1, v2.index == 0
        std::visit(print2, v1, v2);
 
        v1 = 1; v2 = "A";
        result = v1 < v2; // verdadero: v1.index == 0, v2.index == 1
        std::visit(print2, v1, v2);
 
        v1 = v2 = "A";
        result = v1 < v2; // falso
        std::visit(print2, v1, v2);
 
        v2 = "B";
        result = v1 < v2; // verdadero
        std::visit(print2, v1, v2);
 
        v1 = "C";
        result = v1 < v2; // falso
        std::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]