operator==, !=, <, <=, >, >=, <=>(std::variant)
De cppreference.com
<tbody>
</tbody>
| 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(), devuelvefalse; - de lo contrario, si
v.valueless_by_exception(), devuelvetrue; - 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) sistd::get<i>(v) == std::get<i>(w)no es una expresión válida que devuelve un tipo convertible aboolpara cualquieri.
2) Operador de desigualdad para variantes:
- Si
v.index() != w.index(), devuelvetrue; - de lo contrario, si
v.valueless_by_exception(), devuelvefalse; - 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) sistd::get<i>(v) != std::get<i>(w)no es una expresión válida que devuelve un tipo convertible aboolpara cualquieri.
3) Operador menor que para variantes:
- Si
w.valueless_by_exception(), devuelvefalse; - de lo contrario, si
v.valueless_by_exception(), devuelvetrue; - de lo contrario, si
v.index() < w.index(), devuelvetrue; - de lo contrario, si
v.index() > w.index(), devuelvefalse; - 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) sistd::get<i>(v) < std::get<i>(w)no es una expresión válida que devuelve un tipo convertible aboolpara cualquieri.
4) Operador mayor que para variantes:
- Si
v.valueless_by_exception(), devuelvefalse; - de lo contrario, si
w.valueless_by_exception(), devuelvetrue; - de lo contrario, si
v.index() > w.index(), devuelvetrue; - de lo contrario, si
v.index() < w.index(), devuelvefalse; - 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) sistd::get<i>(v) > std::get<i>(w)no es una expresión válida que devuelve un tipo convertible aboolpara cualquieri.
5) Operador menor o igual que para variantes:
- Si
v.valueless_by_exception(), devuelvetrue; - de lo contrario, si
w.valueless_by_exception(), devuelvefalse; - de lo contrario, si
v.index() < w.index(), devuelvetrue; - de lo contrario, si
v.index() > w.index(), devuelvefalse; - 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) sistd::get<i>(v) <= std::get<i>(w)no es una expresión válida que devuelve un tipo convertible aboolpara cualquieri.
6) Operador mayor o igual que para variantes:
- Si
w.valueless_by_exception(), devuelvetrue; - de lo contrario, si
v.valueless_by_exception(), devuelvefalse; - de lo contrario, si
v.index() > w.index(), devuelvetrue; - de lo contrario, si
v.index() < w.index(), devuelvefalse; - 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) sistd::get<i>(v) >= std::get<i>(w)no es una expresión válida que devuelve un tipo convertible aboolpara cualquieri.
7) Operador de comparación de tres vías para variantes:
- Si tanto
v.valueless_by_exception()comow.valueless_by_exception()sontrue, devuelvestd::strong_ordering::equal; - de lo contrario, si
v.valueless_by_exception()estrue, devuelvestd::strong_ordering::less; - de lo contrario, si
w.valueless_by_exception()estrue, devuelvestd::strong_ordering::greater; - de lo contrario, si
v.index() != w.index(), devuelvev.index() <=> w.index(); - de contrario, es equivalente a
std::get<v.index()>(v) <=> std::get<v.index()>(w).
Parámetros
| v,w | - | Variantes a comparar. |
Valor de retorno
El resultado de la comparación como se describe más arriba.
Ejemplo
Ejecuta 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 = "==";
// 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
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) |