A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://en.cppreference.com/w/cpp/algorithm/../ranges/../utility/variant/operator_cmp.html below:

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

Performs comparison operations on std::variant objects.

1-7)

Compares two

std::variant

objects

lhs

and

rhs

. The contained values are compared (using the corresponding operator of

T

) only if both

lhs

and

rhs

contain values corresponding to the same index. Otherwise,

1-6)

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.

(until C++26)

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.

(since C++26)

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 value
(let I be lhs.index() and J be rhs.index()) lhs or rhs is valueless
(let lhs_empty be lhs.valueless_by_exception() and rhs_empty be rhs.valueless_by_exception()) I and J are equal I and J are unequal == 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() see below

For operator<=>:

[edit] Notes [edit] Example
#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