std::compare_weak_order_fallback
| ヘッダ <compare> で定義
|
||
inline namespace /* unspecified */ { inline constexpr /* unspecified */ compare_weak_order_fallback = /* unspecified */; } |
(C++20以上) | |
| Call signature |
||
template< class T, class U > requires /* see below */ constexpr std::weak_ordering compare_weak_order_fallback(T&& t, U&& u) noexcept(/* see below */); |
||
t と u に対して三方比較を行い、 std::weak_ordering 型の結果を生成します (演算子 <=> が利用できない場合でも)。
t および u を式、 T および U をそれぞれ decltype((t)) および decltype((u)) とすると、 std::compare_weak_order_fallback(t, u) は以下と expression-equivalent です。
std::is_same_v<std::decay_t<T>, std::decay_t<U>> == trueの場合、std::weak_order(t, u)が well-formed であれば、その式。- そうでなく、
t == uとt < uがどちらも well-formed かつboolに変換可能であれば、以下の式。
t == u ? std::weak_ordering::equivalent :
t < u ? std::weak_ordering::less :
std::weak_ordering::greater
- ただし
tおよびuは一度だけ評価されます。
- ただし
- それ以外のすべての場合において、
std::compare_weak_order_fallback(t, u)は ill-formed です。
expression-equivalent
式 e と式 f が同じ効果を持ち、どちらも潜在的に例外を投げるかどちらも潜在的に例外を投げない (すなわち noexcept(e) == noexcept(f)) であり、どちらも定数部分式であるかどちらも定数部分式でない場合、 e は f と expression-equivalent です。
カスタマイゼーションポイントオブジェクト
名前 std::compare_weak_order_fallback はカスタマイゼーションポイントオブジェクトを表します。 これは semiregular なリテラルクラス型 (以下 compare_weak_order_fallback_ftor(説明専用)) の const な関数オブジェクトです。 compare_weak_order_fallback_ftor のすべてのインスタンスは等しいです。 すなわち、 std::compare_weak_order_fallback は自由にコピーでき、そのコピーはお互いに交換可能です。
型の集合 Args... が与えられたとき、 std::declval<Args>()... が上記の std::compare_weak_order_fallback の引数に対する要件を満たすならば、 compare_weak_order_fallback_ftor は std::invocable<const compare_weak_order_fallback_ftor&, Args...> を満たします。 そうでなければ、 compare_weak_order_fallback_ftor の関数呼び出し演算子はオーバーロード解決に参加しません。
例
#include <iostream>
#include <compare>
// <=> をサポートしない型。
struct Rational_1 {
int num;
int den; // > 0
};
inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs)
{
return lhs.num * rhs.den < rhs.num * lhs.den;
}
inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs)
{
return lhs.num * rhs.den == rhs.num * lhs.den;
}
// <=> をサポートする型。
struct Rational_2 {
int num;
int den; // > 0
};
inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs)
{
return lhs.num * rhs.den <=> rhs.num * lhs.den;
}
void print(std::weak_ordering value)
{
if (value == 0)
std::cout << "equal\n";
else if (value < 0)
std::cout << "less\n";
else
std::cout << "greater\n";
}
int main()
{
Rational_1 a{1, 2};
Rational_1 b{3, 4};
// print(a <=> b); // 動作しません。
print(std::compare_weak_order_fallback(a, b)); // 動作します (< および == が使用されます)。
Rational_2 c{6, 5};
Rational_2 d{8, 7};
print(c <=> d); // 動作します。
print(std::compare_weak_order_fallback(c, d)); // 動作します。
}
出力:
less
greater
greater
関連項目
(C++20) |
三方比較を行い、 std::weak_ordering 型の結果を生成します (カスタマイゼーションポイントオブジェクト) |