totally_ordered_wrapper Class

template <typename P> class Qt::totally_ordered_wrapper

Qt::totally_ordered_wrapper はラッパー型であり、ラップされた型の厳密な全順序を提供する。詳細...

Header: #include <QtCompare>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core
Since: Qt 6.8

詳しい説明

この型の主な使用例の1つは、ポインタを比較する際の未定義の振る舞い(UB)を防ぐことです。

次のような単純なクラスを考えてみましょう:

template <typename T>
struct PointerWrapperBad {
    int val;
    T *ptr;
};

PointerWrapperBad 型の2つのインスタンスをレキシカルに比較すると、ptr メンバ上でoperator<() またはoperator<=>() を呼び出すため、UBが発生します。

これを修正するには、新しいラッパー型を使います:

template <typename T>
struct PointerWrapperGood {
    int val;
    Qt::totally_ordered_wrapper<T *> ptr;

    friend bool
    operator==(PointerWrapperGood lhs, PointerWrapperGood rhs) noexcept = default;
    friend auto
    operator<=>(PointerWrapperGood lhs, PointerWrapperGood rhs) noexecpt = default;
};

Qt::totally_ordered_wrapper 型のoperator<() 演算子および(利用可能な場合)operator<=>() 演算子は、それぞれstd::lessおよびstd::compare_three_way関数オブジェクトを使用し、比較時にポインタに対する厳密な全順序を提供します。

その結果、PointerWrapperGood::ptr メンバの関係演算子はきちんと定義され、上に示したように、PointerWrapperGood クラスの関係演算子=default を使うこともできる。

本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。