C++2a(C++20)で導入される三方比較演算子(three-way comparison operator)<=>
(通称:宇宙船演算子(spaceship operator))と、C言語時代の関数インタフェースでよくみられる三方比較結果 “負値/値0
/正値” との組合せ利用について。新旧仕様の橋渡し。
例えばmemcmp
関数によるメモリブロック比較結果(int
型)は、さらに値0
と三方比較することでstrong_ordering型の比較結果へと変換できる。
// C++2a #include <cstring> // memcmp #include <compare> auto memblock_compare(const void* p, const void* q, size_t n) -> std::strong_ordering { return std::memcmp(p, q, n) <=> 0; // 下記処理に相当 // int r = std::memcmp(p, q, n); // if (r < 0) return std::strong_ordering::less; // if (r > 0) return std::strong_ordering::greater; // return std::strong_ordering::equal; }
ノート:C++標準ライブラリstd::basic_string
, std::basic_string_view
, std::filesystem::path
のcompare
メンバ関数も三方比較結果を戻り値 “負値/値0
/正値” として返すが、C++2aでは<=>
演算子オーバーロードも直接提供するため本テクニックの利用機会はないだろう。
関連URL
- cpprefjp: 一貫比較, cppreference: Comparison operators