名前空間
変種
操作

std::compare_three_way

提供: cppreference.com
< cpp‎ | utility
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
ヘッダ <compare> で定義
struct compare_three_way;
(C++20以上)

比較を行うための関数オブジェクト。 関数呼び出し演算子の引数の型および戻り値の型を推定します。

目次

[編集] メンバ型

メンバ型 定義
is_transparent /* 未規定 */

[編集] メンバ関数

operator()
両方の引数に対する三方比較の結果を取得します
(パブリックメンバ関数)

std::compare_three_way::operator()

template<class T, class U>

    requires std::three_way_comparable_with<T, U> ||
             /* ポインタを比較する組み込みの演算子に解決される
                std::declval<T>() <=> std::declval<U>() */

constexpr auto operator()(T&& t, U&& u) const;

tu を比較します。 return std::forward<T>(t) <=> std::forward<U>(u); と同等ですが、ポインタを比較する組み込みの operator<=> の呼び出しに解決されるときは除きます。

呼び出しが P 型のポインタを比較する組み込みの演算子に解決されるときは、代わりに以下のように結果が決定されます。

  • P 型のすべてのポインタ値に対する処理系定義の厳密な全順序において、第1引数の (変換後の) 値が第2引数の (変換後の) 値より先行する場合は、 std::strong_ordering::less を返します。 この厳密な全順序は、組み込みの演算子 <><=、および >= による半順序と一貫性があります。
  • そうでなく、同じ厳密な全順序において、第2引数の (変換後の) 値が第1引数の (変換後の) 値より先行する場合は、 std::strong_ordering::greater を返します。
  • そうでなければ、 std::strong_ordering::equal を返します。

TU の両方から P への変換シーケンスが等しさを維持する (下記参照) のでなければ、動作は未定義です。

[編集] 等しさの維持

等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。

  • 式への入力がその被演算子から構成される。
  • 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。

等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。

[編集]

#include <iostream>
#include <compare>
 
struct Rational {
    int num;
    int den; // > 0
 
    // Although the comparison X <=> Y will work, a direct call
    // to std::compare_three_way{}(X,Y) requires the operator==
    // be defined, to satisfy the std::three_way_comparable_with.
    constexpr bool operator==(Rational const&) const = default;
};
 
constexpr std::weak_ordering operator<=>(Rational lhs, Rational rhs)
{
    return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
 
void print(std::weak_ordering value)
{
    value < 0 ? std::cout << "less\n"    :
    value > 0 ? std::cout << "greater\n" :
                std::cout << "equal\n"   ;
}
 
int main()
{
    Rational a{6,5};
    Rational b{8,7};
    print(a <=> b);
    print(std::compare_three_way{}(a,b));
}

出力:

greater
greater

[編集] 関連項目

x == y を実装する関数オブジェクト
(クラス) [edit]
x != y を実装する関数オブジェクト
(クラス) [edit]
x < y を実装する関数オブジェクト
(クラス) [edit]
x > y を実装する関数オブジェクト
(クラス) [edit]
x <= y を実装する関数オブジェクト
(クラス) [edit]
x >= y を実装する関数オブジェクト
(クラス) [edit]