Performs comparison operations on std::variant objects.
1-7)Compares two
std::variantobjects
lhsand
rhs. The contained values are compared (using the corresponding operator of
T
) only if both
lhsand
rhscontain values corresponding to the same index. Otherwise,
Let
@denote the corresponding comparison operator, for each of these functions:
If, for some values of I, the corresponding expression GET
<I>(lhs) @
GET
<I>(rhs) is ill-formed or its result is not convertible to bool, the program is ill-formed.
This overload participates in overload resolution only if for all values of I, the corresponding expression GET
<I>(lhs) @
GET
<I>(rhs) is well-formed and its result is convertible to bool.
If I < sizeof...(Types) is false, the program is ill-formed.
If I == v.index() is false, the behavior is undefined.
[edit] Parameters lhs,rhs - variants to compare [edit] Return value Operator Both operands contains a valueGET
<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() see below
For operator<=>:
#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; // 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; // Compilation error: no known conversion } // TODO: C++20 three-way comparison operator <=> for variants }
Output:
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[edit] See also
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4