operator==, !=, <, <=, >, >=, <=>(std::variant)
De es.cppreference.net
| Definido en el encabezado <variant>
|
||
template< class... Types >
constexpr bool operator==( const std::variant<Types...>& lhs,
const std::variant<Types...>& rhs );
|
(1) | (desde C++17) |
template< class... Types >
constexpr bool operator!=( const std::variant<Types...>& lhs,
const std::variant<Types...>& rhs );
|
(2) | (desde C++17) |
template< class... Types >
constexpr bool operator<( const std::variant<Types...>& lhs,
const std::variant<Types...>& rhs );
|
(3) | (desde C++17) |
template< class... Types >
constexpr bool operator>( const std::variant<Types...>& lhs,
const std::variant<Types...>& rhs );
|
(4) | (desde C++17) |
template< class... Types >
constexpr bool operator<=( const std::variant<Types...>& lhs,
const std::variant<Types...>& rhs );
|
(5) | (desde C++17) |
template< class... Types >
constexpr bool operator>=( const std::variant<Types...>& lhs,
const std::variant<Types...>& rhs );
|
(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...>& lhs,
const std::variant<Types...>& rhs );
|
(7) | (desde C++20) |
| Plantilla de función auxiliar |
||
template< std::size_t I, class... Types >
constexpr const std::variant_alternative_t<I, std::variant<Types...>>&
GET( const variant<Types...>& v );
|
(8) | (solo exposición*) |
Realiza operaciones de comparación en objetos std::variant.
1-7) Compara dos objetos std::variant
lhs y rhs. Los valores contenidos se comparan (usando el operador correspondiente de T) solo si tanto lhs como rhs contienen valores correspondientes al mismo índice. De lo contrario,
lhsse considera igual arhssi, y solo si, tantolhscomorhsno contienen un valor.lhsse considera menor querhssi, y solo si,rhscontiene un valor ylhsno, olhs.index()es menor querhs.index().
1-6) Sea
@ el operador de comparación correspondiente, para cada una de estas funciones:
|
Si, para algunos valores de |
(hasta C++26) |
|
Esta sobrecarga participa en la resolución de sobrecarga solo si para todos los valores de |
(desde C++26) |
8) La plantilla de función de solo exposición
GET se comporta como std::get(std::variant), excepto que std::bad_variant_access nunca se lanza. Si
I < sizeof...(Types) es false, el programa está mal formado. Si
I == v.index() es false, el comportamiento es indefinido.Parámetros
| lhs,rhs | - | variantes a comparar |
Valor de retorno
| Operador |
Ambos operandos contienen un valor
(sea I el lhs. index ( ) y J el rhs. index ( ) ) |
lhs
o
rhs
carece de valor
(sea lhs_empty el lhs. valueless_by_exception ( ) y rhs_empty el rhs. valueless_by_exception ( ) ) |
|
|---|---|---|---|
| I e J son iguales | I e J son diferentes | ||
| == |
GET
<
I
>
(
lhs
)
==
GET
<
I
>
(
rhs
)
|
false | lhs_empty && rhs_empty |
| ! = |
GET
<
I
>
(
lhs
)
!
=
GET
<
I
>
(
rhs
)
|
true | lhs_empty ! = rhs_empty |
| < |
GET
<
I
>
(
lhs
)
<
GET
<
I
>
(
rhs
)
|
lhs. index ( ) < rhs. index ( ) | lhs_empty && ! rhs_empty |
| > |
GET
<
I
>
(
lhs
)
>
GET
<
I
>
(
rhs
)
|
lhs. index ( ) > rhs. index ( ) | ! lhs_empty && rhs_empty |
| <= |
GET
<
I
>
(
lhs
)
<=
GET
<
I
>
(
rhs
)
|
lhs. index ( ) < rhs. index ( ) | lhs_empty |
| >= |
GET
<
I
>
(
lhs
)
>=
GET
<
I
>
(
rhs
)
|
lhs. index ( ) > rhs. index ( ) | rhs_empty |
| <=> |
GET
<
I
>
(
lhs
)
<=>
GET
<
I
>
(
rhs
)
|
lhs. index ( ) <=> rhs. index ( ) | ver abajo |
Para operator <=> :
- Si solo lhs carece de valor, retorna std::strong_ordering::less .
- Si solo rhs carece de valor, retorna std::strong_ordering::greater .
- Si tanto lhs como rhs carecen de valor, retorna std::strong_ordering::equal .
Notas
| Macro de prueba de características | Valor | Std | Característica |
|---|---|---|---|
__cpp_lib_constrained_equality
|
202403L
|
(C++26) | operadores de comparación restringidos para std::variant |
Ejemplo
Ejecutar este código
#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 = "=="; // por defecto v1 = 0, v2 = 0; result = v1 == v2; // true std::visit(print2, v1, v2); v1 = v2 = 1; result = v1 == v2; // true std::visit(print2, v1, v2); v2 = 2; result = v1 == v2; // false std::visit(print2, v1, v2); v1 = "A"; result = v1 == v2; // false: v1.index == 1, v2.index == 0 std::visit(print2, v1, v2); v2 = "B"; result = v1 == v2; // false std::visit(print2, v1, v2); v2 = "A"; result = v1 == v2; // true std::visit(print2, v1, v2); } std::cout << "operator<\n"; { cmp = "<"; v1 = v2 = 1; result = v1 < v2; // false std::visit(print2, v1, v2); v2 = 2; result = v1 < v2; // true std::visit(print2, v1, v2); v1 = 3; result = v1 < v2; // false std::visit(print2, v1, v2); v1 = "A"; v2 = 1; result = v1 < v2; // false: v1.index == 1, v2.index == 0 std::visit(print2, v1, v2); v1 = 1; v2 = "A"; result = v1 < v2; // true: v1.index == 0, v2.index == 1 std::visit(print2, v1, v2); v1 = v2 = "A"; result = v1 < v2; // false std::visit(print2, v1, v2); v2 = "B"; result = v1 < v2; // true std::visit(print2, v1, v2); v1 = "C"; result = v1 < v2; // false 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 conocida } // TODO: Operador de comparación de tres vías de C++20 <=> para variants }
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
Véase también
|
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++17)
(C++20)
|
compara objetos
optional
(plantilla de función) |