名前空間
変種
操作

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

From cppreference.com
< cpp‎ | utility‎ | variant
 
 
ユーティリティライブラリ
言語サポート
型のサポート (基本型、RTTI)
ライブラリ機能検査マクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三方比較
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
 
 
ヘッダ <variant> で定義
template< class... Types >

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

                           const std::variant<Types...>& rhs );
(1) (C++17以降)
template< class... Types >

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

                           const std::variant<Types...>& rhs );
(2) (C++17以降)
template< class... Types >

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

                          const std::variant<Types...>& rhs );
(3) (C++17以降)
template< class... Types >

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

                          const std::variant<Types...>& rhs );
(4) (C++17以降)
template< class... Types >

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

                           const std::variant<Types...>& rhs );
(5) (C++17以降)
template< class... Types >

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

                           const std::variant<Types...>& rhs );
(6) (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) (C++20以降)
ヘルパー関数テンプレート
template< std::size_t I, class... Types >

constexpr const std::variant_alternative_t<I, std::variant<Types...>>&

    GET( const variant<Types...>& v );
(8) (説明用*)

std::variant オブジェクトに対して比較演算を実行します。

1-7) 2つの std::variant オブジェクト lhsrhs を比較します。含まれる値は、lhsrhs の両方が同じインデックスに対応する値を含んでいる場合にのみ比較されます (T の対応する演算子を使用)。そうでない場合、
  • lhs は、lhsrhs の両方が値を含んでいない場合に限り、rhs等しいと見なされます。
  • lhs は、rhs が値を持ち lhs が持たない場合、または lhs.index()rhs.index() より小さい場合に限り、rhs より小さいと見なされます。
1-6) @ を対応する比較演算子とします。これらの各関数について、

ある I の値について、対応する式 GET <I>(lhs) @ GET <I>(rhs) が不正な形式であるか、その結果が bool に変換できない場合、プログラムは不正な形式です。

(C++26まで)

このオーバーロードは、すべての I の値について、対応する式 GET <I>(lhs) @ GET <I>(rhs) が正しい形式であり、その結果が bool に変換できる場合にのみ、オーバーロード解決に参加します。

(C++26以降)
8) 説明専用関数テンプレート GET は、std::bad_variant_access がスローされないことを除いて、std::get(std::variant) と同様に動作します。
I < sizeof...(Types)false の場合、プログラムは不正な形式です。
I == v.index()false の場合、動作は未定義です。

目次

[編集] パラメータ

lhs,rhs - 比較するバリアント

[編集] 戻り値

 演算子  両方のオペランドが値を含む
(Ilhs.index() とし、Jrhs.index() とします)
lhs または rhs が値を持たない
(lhs_emptylhs.valueless_by_exception() とし、rhs_emptyrhs.valueless_by_exception() とします)
IJ は等しい IJ は等しくない
== 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() 下記参照

operator<=> について

[編集] ノート

機能テストマクロ 規格 機能
__cpp_lib_constrained_equality 202403L (C++26) std::variant の制約付き比較演算子

[編集]

#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
}

出力

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

[編集] 関連項目

(C++17)(C++17)(C++17)(C++17)(C++17)(C++17)(C++20)
optional オブジェクトを比較する
(function template) [編集]
English 日本語 中文(简体) 中文(繁體)