std::compare_three_way
提供: cppreference.com
<tbody>
</tbody>
| ヘッダ <compare> で定義
|
||
struct compare_three_way; |
(C++20以上) | |
比較を行うための関数オブジェクト。 関数呼び出し演算子の引数の型および戻り値の型を推定します。
メンバ型
| メンバ型 | 定義 |
is_transparent
|
/* 未規定 */ |
メンバ関数
operator() |
両方の引数に対する三方比較の結果を取得します (パブリックメンバ関数) |
std::compare_three_way::operator()
<tbody> </tbody> 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; |
||
t と u を比較します。 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を返します。
T と U の両方から P への変換シーケンスが等しさを維持する (下記参照) のでなければ、動作は未定義です。
等しさの維持
等しい入力を与えると等しい出力が得られる場合、その式は等しさを維持します。
- 式への入力がその被演算子から構成される。
- 式の出力がその結果およびその式によって変更されるすべての被演算子 (もしあれば) から構成される。
等しさを維持することが要求されるすべての式は、さらに安定であることも要求されます。 同じ入力オブジェクトを用いたそのような式の2回の評価は、間にそれらの入力オブジェクトの変更が明示的に挟まれなければ、等しい出力が得られなければなりません。
例
Run this code
#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
関連項目
(C++20) |
x == y を実装する関数オブジェクト (クラス) |
(C++20) |
x != y を実装する関数オブジェクト (クラス) |
(C++20) |
x < y を実装する関数オブジェクト (クラス) |
(C++20) |
x > y を実装する関数オブジェクト (クラス) |
(C++20) |
x <= y を実装する関数オブジェクト (クラス) |
(C++20) |
x >= y を実装する関数オブジェクト (クラス) |