Комитет по стандартизации пора расстрелять. Такое ощущение, что эти дебилы никогда не писали софт сложнее hello world.
std::strong_ordering cmp = .... ;
if( cmp ) // error
{
}
else
{
Printf(Con,"equal\n");
}
switch( cmp ) // error
{
case std::strong_ordering::less : break; // error
case std::strong_ordering::greater : break; // error
case std::strong_ordering::equal : break; // error
}
Кстати, обратите внимание, какие замечательные короткие имена нам предлагают использовать для констант. На пол-экрана. А чо такова, мониторы-то теперь широкие?
Вылечить можно так. Хакаем заголовок <compare>.
| много букв |
| class strong_ordering
{
__cmp_cat::type _M_value;
....
public:
....
constexpr operator int() const { return _M_value; }
#if 1
friend constexpr bool
operator==(strong_ordering __v, int t) noexcept
{ return __v._M_value == t; }
friend constexpr bool
operator!=(strong_ordering __v, int t) noexcept
{ return __v._M_value != t; }
friend constexpr bool
operator< (strong_ordering __v, int t) noexcept
{ return __v._M_value < t; }
friend constexpr bool
operator> (strong_ordering __v, int t) noexcept
{ return __v._M_value > t; }
friend constexpr bool
operator<=(strong_ordering __v, int t) noexcept
{ return __v._M_value <= t; }
friend constexpr bool
operator>=(strong_ordering __v, int t) noexcept
{ return __v._M_value >= t; }
friend constexpr bool
operator< (int t, strong_ordering __v) noexcept
{ return t < __v._M_value; }
friend constexpr bool
operator> (int t, strong_ordering __v) noexcept
{ return t > __v._M_value; }
friend constexpr bool
operator<=(int t, strong_ordering __v) noexcept
{ return t <= __v._M_value; }
friend constexpr bool
operator>=(int t, strong_ordering __v) noexcept
{ return t >= __v._M_value; }
friend constexpr strong_ordering
operator<=>(strong_ordering __v, int /*zero*/) noexcept
{ return __v; }
friend constexpr strong_ordering
operator<=>(int /*zero*/, strong_ordering __v) noexcept
{ return strong_ordering(__cmp_cat::_Ord(-__v._M_value)); }
#endif
....
// comparisons
friend constexpr bool
operator==(strong_ordering, strong_ordering) noexcept = default;
#if 0
friend constexpr bool
operator==(strong_ordering __v, __cmp_cat::__unspec) noexcept
{ return __v._M_value == 0; }
friend constexpr bool
operator< (strong_ordering __v, __cmp_cat::__unspec) noexcept
{ return __v._M_value < 0; }
friend constexpr bool
operator> (strong_ordering __v, __cmp_cat::__unspec) noexcept
{ return __v._M_value > 0; }
friend constexpr bool
operator<=(strong_ordering __v, __cmp_cat::__unspec) noexcept
{ return __v._M_value <= 0; }
friend constexpr bool
operator>=(strong_ordering __v, __cmp_cat::__unspec) noexcept
{ return __v._M_value >= 0; }
friend constexpr bool
operator< (__cmp_cat::__unspec, strong_ordering __v) noexcept
{ return 0 < __v._M_value; }
friend constexpr bool
operator> (__cmp_cat::__unspec, strong_ordering __v) noexcept
{ return 0 > __v._M_value; }
friend constexpr bool
operator<=(__cmp_cat::__unspec, strong_ordering __v) noexcept
{ return 0 <= __v._M_value; }
friend constexpr bool
operator>=(__cmp_cat::__unspec, strong_ordering __v) noexcept
{ return 0 >= __v._M_value; }
friend constexpr strong_ordering
operator<=>(strong_ordering __v, __cmp_cat::__unspec) noexcept
{ return __v; }
friend constexpr strong_ordering
operator<=>(__cmp_cat::__unspec, strong_ordering __v) noexcept
{ return strong_ordering(__cmp_cat::_Ord(-__v._M_value)); }
#endif
};
|
| |
К себе добавляем что-нибудь по вкусу.
inline constexpr int CmpLess = std::strong_ordering::less ;
inline constexpr int CmpGreater = std::strong_ordering::greater ;
inline constexpr int CmpEqual = std::strong_ordering::equal ;
Теперь можно спокойно работать.
auto cmp = .... ; // вместо std::strong_ordering
if( cmp ) // ok
{
}
else
{
Printf(Con,"equal\n");
}
switch( cmp ) // ok
{
case CmpLess : break; // ok
case CmpGreater : break; // ok
case CmpEqual : break; // ok
}