Они сделали дерьмо опять
От: Шахтер Интернет  
Дата: 18.05.20 20:33
Оценка: -4 :))
Комитет по стандартизации пора расстрелять. Такое ощущение, что эти дебилы никогда не писали софт сложнее 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
    }
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Отредактировано 19.05.2020 7:39 Шахтер . Предыдущая версия . Еще …
Отредактировано 18.05.2020 20:40 Шахтер . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.