namespace std {
class strong_ordering {
int value; //説明専用メンバ変数
constexpr explicit strong_ordering(int v) noexcept : value(v) {} //説明専用コンストラクタ
public:
static const strong_ordering less;
static const strong_ordering equal;
static const strong_ordering equivalent;
static const strong_ordering greater;
};
//静的メンバ定数の定義(初期化している値は説明のためのもの)
inline constexpr strong_ordering strong_ordering::less(-1);
inline constexpr strong_ordering strong_ordering::equal(0);
inline constexpr strong_ordering strong_ordering::equivalent(0));
inline constexpr strong_ordering strong_ordering::greater(1);
}
概要
strong_ordering
は<=>
の戻り値型として利用される比較カテゴリ型の一つであり、その比較が全順序の要件を満たしている事を表明する。
上記の説明専用のメンバ変数やコンストラクタは実際に実装されるものではなく、各定数の初期化時の値もあくまで説明専用のものである。これらに依存したプログラムにならないように注意が必要である。
代入可能性(substitutability)
strong_ordering
による等値比較は代入可能性を満たしている事を表明する。
strong_ordering
を返す<=>
はそのように実装されている事が期待される。
静的メンバ定数
比較カテゴリ型はコンストラクタの提供が規定されていないため、その値は静的メンバ定数から取得する必要がある。
名前 | 説明 | 対応バージョン |
---|---|---|
less |
a <=> b の比較結果がa < b である事を表す値 |
C++20 |
equal, equivalent |
a <=> b 比較結果が等値(a == b )である事を表す値 |
C++20 |
greater |
a <=> b の比較結果がa > b である事を表す値 |
C++20 |
メンバ関数
比較カテゴリ型への暗黙変換
名前 | 説明 | 対応バージョン |
---|---|---|
oeprator partial_ordering |
partial_ordering への型変換演算子 |
C++20 |
oeprator weak_ordering |
weak_ordering への型変換演算子 |
C++20 |
比較演算子
名前 | 説明 | 対応バージョン |
---|---|---|
operator== |
等値比較 | C++20 |
operator!= |
非等値比較 (== により使用可能) |
C++20 |
operator< |
左辺が右辺より小さいかを判定する | C++20 |
operator<= |
左辺が右辺以下かを判定する | C++20 |
operator> |
左辺が右辺より大きいかを判定する | C++20 |
operator>= |
左辺が右辺以上かを判定する | C++20 |
operator<=> |
三方比較 | C++20 |
strong_orderingによるカスタム比較実装例
#include <iostream>
#include <string>
#include <compare>
struct national {
std::size_t my_number;
std::string first_name;
std::string last_name;
auto operator<=>(const national& that) const -> std::strong_ordering {
//宣言と逆順の比較
if (auto comp = last_name <=> that.last_name ; comp != 0) return comp;
if (auto comp = first_name <=> that.first_name; comp != 0) return comp;
return my_number <=> that.my_number;
}
};
int main()
{
national p1 = {1, "tarou", "yamada"}, p2 = {2, "hanako", "suzuki"};
std::cout << std::boolalpha;
std::cout << (p1 < p2) << std::endl;
std::cout << (p1 <= p2) << std::endl;
std::cout << (p1 > p2) << std::endl;
std::cout << (p1 >= p2) << std::endl;
}
xxxxxxxxxx
#include <iostream>
#include <string>
#include <compare>
struct national {
std::size_t my_number;
std::string first_name;
std::string last_name;
auto operator<=>(const national& that) const -> std::strong_ordering {
//宣言と逆順の比較
if (auto comp = last_name <=> that.last_name ; comp != 0) return comp;
if (auto comp = first_name <=> that.first_name; comp != 0) return comp;
return my_number <=> that.my_number;
}
};
int main()
{
national p1 = {1, "tarou", "yamada"}, p2 = {2, "hanako", "suzuki"};
std::cout << std::boolalpha;
std::cout << (p1 < p2) << std::endl;
std::cout << (p1 <= p2) << std::endl;
std::cout << (p1 > p2) << std::endl;
std::cout << (p1 >= p2) << std::endl;
}
出力
false
false
true
true
バージョン
言語
- C++20
処理系
- Clang: 8.0 ✅
- GCC: 10.1 ✅
- Visual C++: 2019 ✅