Namensräume
Varianten

std::common_comparison_category

Aus cppreference.com
<tbody> </tbody>
definiert in Header <compare>
template<class... Ts> struct common_comparison_category { using type = /*see below*/ ; };

Das Klassentemplate std::common_comparison_category bietet einen Alias (durch den Klassentyp type) für die stärkste Vergleichskategorie in die alle Templateargument konvertiert werden können.

Die gemeinsame stärkste Vergleichskategorie einer Liste von n Typen T0...Tn-1 ist wie folgt definiert:

Templateparameter

...Ts - eine möglicherweise leere Liste von Typen

Hilfstemplates

<tbody> </tbody>
template< class... Ts > using common_comparison_category_t = typename common_comparison_category<Ts...>::type;

Hilfstypen

Typ Definition
type die stärkste, gemeinsame Vergleichskategorie (wie oben definiert)

Mögliche Implementierung

namespace detail {

template<unsigned int>
struct common_cmpcat_base     { using type = void; };
template<>
struct common_cmpcat_base<0u> { using type = std::strong_ordering; };
template<>
struct common_cmpcat_base<2u> { using type = std::partial_ordering; };
template<>
struct common_cmpcat_base<4u> { using type = std::weak_ordering; };
template<>
struct common_cmpcat_base<6u> { using type = std::partial_ordering; };

} // namespace detail

template<class...Ts>
struct common_comparison_category :
    detail::common_cmpcat_base<(0u | ... | 
        (std::is_same_v<Ts, std::strong_ordering>  ? 0u :
         std::is_same_v<Ts, std::weak_ordering>    ? 4u :
         std::is_same_v<Ts, std::partial_ordering> ? 2u : 1u)
    )> {};

Beispiel

Referenzen

das Ergebnis des 3-Wegevergleichs, der alle 6 Operatoren unterstützt und ersetzbar ist
(Klasse) [edit]
das Ergebnis eines 3-Wegevergleichs, der alle 6 Operatoren unterstützt und nicht ersetzbar ist
(Klasse) [edit]
der Ergebnistyp des 3-Wegevergleichs, der alle 6 Operatoren unterstützt, nicht ersetzbar ist und nichtvergleichbare Werte erlaubt
(Klasse) [edit]